假设一个表有4列A,B,C和D.只有一列定义了唯一性,这就是它为主键的原因。 B,C和D允许条目重复,这就是为什么我们不能将它们作为复合备用密钥。是否可以在主键和备用键中使用相同的列,例如,将备用键设置为(A和B)?
除非我没有得到你的想法,对于MS SQL很有可能,看看这个测试:
CREATE TABLE Alternate (
A int IDENTITY(1,1) NOT NULL,
B int NULL,
C int NULL,
D int NULL,
CONSTRAINT PK_Alternate PRIMARY KEY (A),
CONSTRAINT AK_Alternate Unique (A,B)
)
GO
insert into Alternate (B) values(1)
insert into Alternate (B) values(1)
insert into Alternate (B) values(1)
insert into Alternate (B) values(null)
insert into Alternate (B) values(null)
insert into Alternate (B) values(null)
select A, B from Alternate
结果如下:
1 1
2 1
3 1
4 NULL
5 NULL
6 NULL
形式上:
所以在你的例子中:{A,B}不是一个关键,因为它不是最小的(你可以带走B并且仍然具有唯一性)。
虽然典型的DBMS会让你创建一个“包含”PRIMARY KEY的UNIQUE约束,但这不是一个好主意 - 你违反了数据库设计原则,即“一切都应该依赖于密钥,整个密钥而不是密钥”。
顺便说一下,你为什么还想做这样的事呢?您是否只是出于性能原因而试图避免使用2个索引(在{A}和{A,B}上)?如果是这样,请记住“索引”和“密钥”是两个独立的概念 - 前者是物理/性能相关的,而后者是逻辑的。索引经常支持密钥的事实(出于性能原因)不应模糊这种区别。
根据您的DBMS,您可能能够在A上的{A,B}和PRIMARY KEY上创建INDEX而无需在{A}上创建INDEX。