今天我遇到了一个场景,我发现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约束和唯一约束。
我想了解一下这个独特密钥单独创建的优势是什么?
始终与主键一起创建唯一约束是一种好习惯吗?如果答案是"否",在什么情况下会有利。
我觉得这是一个非常基本的问题,但我想得到一些专家的想法和建议。
谢谢。
答案 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 KEY
或UNIQUE
约束。PRIMARY KEY
约束默认值 至CLUSTERED
,UNIQUE
约束默认为NONCLUSTERED
。
因此,UNIQUE
索引对PRIMARY KEY
定义来说是多余的。我只能想象有人会先创建它,然后决定将列设为PRIMARY KEY
,忘记删除聚集索引。这种情况可能发生的一个原因是代码是否使用INDEX
提示,并为索引指定了显式名称。