自定义PrimaryKey生成与自动增量

时间:2010-01-03 23:52:15

标签: sql-server primary-key auto-increment

我需要为2个或更多表定义和生成主键。

表格包含相同类型的数据,但对于某些业务规则,我们必须将它们分开,例如

表A = LOCAL_CUSTOMERS
表B = INTERNATIONAL_CUSTOMERS

两者都拥有相同的列,例如CUSTOMER_ID C_NAME,CITY ....等

在设计主键时,我希望这些键是组合键 PREFIX和一个自动生成的数字,作为一个自动递增的int PK就可以了。

例如,表“LOCAL_CUSTOMERS”的CUSTOMER_ID(PK)

LOC1,LOC2,LOC3,...... LOC5000

表“INTERNATIONAL_CUSTOMERS”的

和CUSTOMER_ID(PK)

INT1,INT2,INT3,...... INT5000

LOC和INT是LOCAL,INTERNATIONAL的前缀。

我们可以使用int在“身份规范”中设置自动增量但是我该怎么做? 是否需要为列设置“计算列规范”?

由于

6 个答案:

答案 0 :(得分:2)

您可以在区域ID和自动ID上使用复合键。

也可以有一个触发器,在插入时将pk设置为自定义字符串。

一般来说,最好将它们保存在同一个表中(因为它们具有相同的列),并且只有本地与国际不同。

答案 1 :(得分:2)

如果您建议的2个表具有相同的列,那么我认为没有理由为什么要将它们分别制作单独的表。创建一个列,用于存储客户类型(国际或国内)并跟踪该方式。为什么在1就足够时使用2个表?

答案 2 :(得分:1)

我认为如果可能的话,你应该将它们保存在同一个表中,并添加另一列来区分本地和国际客户。使用2个表,您将来需要完成的所有工作加倍。更不用说使用计算的varchar id值而不是简单生成的long id。

答案 3 :(得分:1)

您尝试实现的内容称为子类型:同类对象的特殊情况。有几种常见的方法可以实现它:

  1. 制作一个包含两种类型所需列的表。对不适用于所有类型的属性使用NULLable列,对所有其他属性使用必需列。只有一个表,所以只在pk。
  2. 为所有公共属性(基本类型)创建一个包含生成的pk的表。为每个子类型添加单独的表。这些表有一个pk,它使用外键指向基类型的pk(因此,与基类型具有1:1的关系)。因此,两种类型都使用相同的键值集
  3. (还有更多方法,但这些方法最有用,最受欢迎)

    我会建议vehementlyu反对各种“智能”键。当然,您可以在表中使用“类型”列(基本类型的列)来快速确定您要处理的内容。但是像你所暗示的一个关键方案只是使事情变得复杂而没有实际价值。

答案 4 :(得分:1)

你绝对可以用计算列来做到这一点。

要么,如果你坚持使用两个表,你可以简单地添加一个计算的,持久化的列,如下所示:

ALTER TABLE Local_Customer
  ADD CustomerID AS 'LOC' + CAST(ID AS VARCHAR(7)) PERSISTED

ALTER TABLE International_Customer
  ADD CustomerID AS 'INT' + CAST(ID AS VARCHAR(7)) PERSISTED

如果您决定使用包含discrimator列的单个表格,例如类型为BIT的“IsDomestic”,您可以根据“IsDomestic”列的值,使用“LOC”或“INT”作为前缀执行单个计算列:

ALTER TABLE Customer
  ADD CustomerID AS CASE IsDomestic WHEN 0 THEN 'INT' ELSE 'LOC' END + CAST(ID AS VARCHAR(7)) PERSISTED

无论哪种方式 - 每个行都会自动增加INT IDENTITY类型的“ID”字段,计算列将自动创建一个更易读的“CustomerID”,无需您做任何进一步的努力。

答案 5 :(得分:0)

其他答案都是有效点。

我想补充一点,因为看起来有一些希望为本地和国际客户提供单独的序列,依赖对任何特定的顺序行为都是一个坏主意。特别是,对于标识列,如果插入失败并回滚,则可能存在间隙(标识是立即为事务保留的,但如果约束或触发器失败则永远不会插入)。也可以更改种子和间距,也可以使用标识插入来插入非连续值。

我会提倡带有客户类型标志的真正代理身份列。您的标识列在所有客户中都是唯一的。如果您绝对需要单独的序列,您可以编写触发器以获得真正的无间隙序列或使用标识。然后,您可以根据需要使用持久计算列来构建组合键并在该列上放置索引。