在表的同一列上定义的主键约束和唯一约束

时间:2017-02-10 22:03:40

标签: sql sql-server

今天我遇到了一个场景,我发现SQL Server实际上允许我们在同一列上创建主键约束和唯一约束。我希望它不会在语法上抛出任何错误。

我测试了它,似乎工作正常。

示例代码:

CREATE TABLE testtable
(
    id INT IDENTITY(1,1),
    name VARCHAR(10),

    CONSTRAINT PK_ID PRIMARY KEY (id),
    CONSTRAINT uk_id UNIQUE (id)
)

我还看到它分别创建了PK约束和唯一约束。

我想了解一下这个独特密钥单独创建的优势是什么?

始终与主键一起创建唯一约束是一种好习惯吗?如果答案是"否",在什么情况下会有利。

我觉得这是一个非常基本的问题,但我想得到一些专家的想法和建议。

谢谢。

3 个答案:

答案 0 :(得分:4)

唯一约束是在数据库中列为约束对象的唯一索引。

这将与您的聚集索引(此实例中的主键)分开存在。

这可能有一些好处,例如对于此表的其他表的外键查找,因为创建的唯一索引将小于聚簇索引(如果表中有其他列)。

Adding nonclustered index on primary keys

Unique Constraints and Unique Indexes

如果您的主键不是群集密钥,我认为您很难找到优势,在这种情况下,您将添加一个冗余的唯一非聚簇索引(即使有一个也是如此) isn' ta主键。)

答案 1 :(得分:2)

没有优势,唯一密钥对于群集主键是多余的。

通常,唯一键用于强制不在主键上的唯一约束,或者需要与主键不同的键的外键。

答案 2 :(得分:2)

该问题已被编辑,使其他两个答案有点误导。编辑删除了主键的显式(和排序冗余)CLUSTERED声明。

在SQL Server中,主键不一定是群集的。主键有两个特征:

  • 他们是NOT NULL
  • 他们是UNIQUE

在某些数据库中,PRIMARY KEY声明必然会创建聚簇索引。在SQL Server中,这是默认行为,但不是必需的:

  

CLUSTERED | NONCLUSTERED

     

表示为其创建了聚簇索引或非聚簇索引   PRIMARY KEYUNIQUE约束。 PRIMARY KEY约束默认值   至CLUSTEREDUNIQUE约束默认为NONCLUSTERED

因此,UNIQUE索引对PRIMARY KEY定义来说是多余的。我只能想象有人会先创建它,然后决定将列设为PRIMARY KEY,忘记删除聚集索引。这种情况可能发生的一个原因是代码是否使用INDEX提示,并为索引指定了显式名称。