IDENTITY列 - 好还是坏?

时间:2012-08-16 01:12:53

标签: sql sql-server

我仍在努力解决如果使用PK的标识列,当你可以使用现有专栏时,这是正确的方法。

示例:

CREATE TABLE person_link
(
     person_link_id INT NOT NULL IDENTITY(1,1)
    ,owner_person_id INT NOT NULL
    ,link_person_id INT NOT NULL
    ,link_date_created DATETIME NOT NULL DEFAULT(GETDATE())
    ,deleted_person_id INT NULL

     CONSTRAINT pk_person_link PRIMARY KEY(person_link_id)
    ,CONSTRAINT fk_person_link_owner FOREIGN KEY (owner_person_id) REFERENCES person (person_id)
    ,CONSTRAINT fk_person_link_link FOREIGN KEY (link_person_id) REFERENCES person (person_id)
)

或者,我应该删除person_link_id,而是将主键放在我的两列中,这些列始终是唯一的。即:

CONSTRAINT pk_person_link PRIMARY KEY(owner_person_id, link_person_id)

这只是个人选择,还是有充分的理由不使用身份(我赞成,纯粹是因为 - 我一直这样做)。

3 个答案:

答案 0 :(得分:3)

使用标识列作为聚簇索引的一个优点是每个插入都是最后一条记录,因此SQL Server不需要求助索引。

加入时也有一个优点,你只需要在子表中有1个引用。

这些可能不相关,具体取决于您要添加的数据或数据库架构(如果您需要在其他地方使用它)

答案 1 :(得分:2)

我赞成标识栏。反复地,我发现找到确切的行是有用的。

例如,我几乎本能地编写以下查询来查找添加到表中的最新行:

select t.*
from t
order by 1 desc

这很有效,因为我总是将标识作为表格中的第一列。

此外,在表上进行连接时,主键可以是单个字段。如果您想要识别特定的实体,那么就没有特定的实体ID。

答案 2 :(得分:2)

根据需要,我个人会在记录中使用自然主键,因此两列始终是唯一的。

所以表格是:

table:
owner_person_id int -- PK
link_person_id int -- PK

但这实际上取决于您对表和数据库设计的计划选择哪个选项。