假设一个表有4列A,B,C和D.只有一列定义了唯一性,这就是它为主键的原因。 B,C和D允许条目重复,这就是为什么我们不能将它们作为复合备用密钥。是否可以在主键和备用键中使用相同的列,例如,将备用键设置为(A和B)?
答案 0 :(得分:4)
除非我没有得到你的想法,对于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
答案 1 :(得分:2)
形式上:
所以在你的例子中:{A,B}是不一个键,因为它不是最小(你可以带走B并且仍然具有唯一性)。
虽然典型的DBMS 将让你创建一个“包含”PRIMARY KEY的UNIQUE约束,但这不是一个好主意 - 你违反了数据库设计原则“一切都应该依赖于一把钥匙,整个钥匙,只有钥匙“。
根据您的DBMS,您可能能够在A上的{A,B}和PRIMARY KEY上创建一个INDEX而无需在{A}上创建INDEX。