代码之家  ›  专栏  ›  技术社区  ›  Brann

使用计算列作为主键的一部分是好主意吗?

  •  7
  • Brann  · 技术社区  · 16 年前

    我有一个定义为:

    OrderID bigint NOT NULL,
    IDA varchar(50) NULL,
    IDB bigint NULL,
    [ ... 50 other non relevant columns ...]
    

    这个表的自然主键是(OrderID,IDA,IDB),但这是不可能的,因为IDA和IDB可以为null(它们都可以为null,但它们永远不会同时定义)。现在我对这3列有一个唯一的约束。

    现在,我需要一个主键来启用事务复制,我面临两个选择:

    • 创建标识列并将其用作主键
    • 创建一个包含IDA或IDB或“”的非空计算列C,如果两列都为null,则使用(OrderID,C)作为主键。

    第二个替代的接缝清洁剂,如我的PK将是有意义的,是可行的(见 msdn link

    1 回复  |  直到 16 年前
        1
  •  2
  •   Michael    16 年前

    可以为null的列不能作为主键的一部分,因为主键也必须是唯一的。

    而且PK永远不应该有意义,因为值的含义可能会改变。

    OrderID应该是唯一的,因此对于PK来说足够了。

    推荐文章