2010-01-03 101 views
2

我需要为2个或更多表定义并生成主键。使用自动增量自定义主键生成

表持有相同类型的数据,但对于某些业务规则,我们必须让他们分开说喜欢

表A = LOCAL_CUSTOMERS
表B = INTERNATIONAL_CUSTOMERS

两个持有类似,CUSTOMER_ID c_name和市同列。 ...等

在设计主键时,我希望这些键是 PREFIX和一个自动生成的数字的组合,因为自动增量式int PK会这样做。

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

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

和CUSTOMER_ID(PK)为表 “INTERNATIONAL_CUSTOMERS”

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

LOC和INT是LOCAL,INTERNATIONAL的前缀。

我们可以使用int设置“身份规范”中的自动增量,但我该如何做到这一点? 是否需要为列设置“计算列说明”?

谢谢

回答

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列,例如单个表“IsDomestic”类型BIT的,你能做到这一点会用“LOC”或“INT”作为前缀,基于“IsDomestic”列的值的单个计算列:

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”,而无需您做任何进一步的努力。

+0

感谢队友了解问题并提供“解决方案” – 2010-01-04 13:33:46

2

你可以在区域ID和自动ID上有复合键。

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

一般来说,最好将它们保留在同一个表格中(因为它们具有相同的列),只有local和intl不同。

1

我想你应该尽可能将它们放在同一张表中,然后再添加一列来区分本地和国际客户。使用2个表格,您将这些表格中将来需要做的所有工作翻倍。更不用说使用计算的varchar id值而不是简单生成的long id。

1

你试图实现的是被称为子类型:同类对象的特例。有几种常见的方法来实现它:

  1. 使一个表包含这两种类型所需的所有列。对那些不适用于所有类型的属性使用NULLable列,对所有其他属性使用强制列。只有一张桌子,所以只在PK上。
  2. 使用生成的pk为所有常见属性(基本类型)创建一个表。为每个子类型添加单独的表格。这些表有一个pk,它使用外键指向基类型的pk(因此与基类型有1:1的关系)。因此,这两种类型的同一组键值

的绘制(有更多的方法,但这些是最有用的,和最流行的)

我会建议vehementlyu反对形形色色的“智能”键。当然,你可以在你的表中有一个“type”列(用于基本类型)来快速确定你正在处理的内容。但像你这样的关键计划只是让事情变得复杂而没有真正的价值。

2

如果你提出的2个表具有相同的列,那么我看不出为什么你应该使它们成为单独的表。创建一个用于存储客户类型(国际或国内)的列并保持该方式。为什么使用2个表格就足够了?

0

其他答案都有效。

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

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