表中的复合备用键

时间:2011-09-11 06:28:13

标签: sql alternate

假设一个表有4列A,B,C和D.只有一列定义了唯一性,这就是它为主键的原因。 B,C和D允许条目重复,这就是为什么我们不能将它们作为复合备用密钥。是否可以在主键和备用键中使用相同的列,例如,将备用键设置为(A和B)?

2 个答案:

答案 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约束,但这不是一个好主意 - 你违反了数据库设计原则“一切都应该依赖于一把钥匙,整个钥匙,只有钥匙“。


顺便说一下,你为什么要这样做呢?您是否只是出于性能原因而试图避免使用2个索引(在{A}和{A,B}上)?如果是这样,请记住“索引”和“密钥”是两个独立的概念 - 前者是物理/性能相关的,而后者是逻辑的。索引经常支持密钥的事实(出于性能原因)不应模糊这种区别。

根据您的DBMS,您可能能够在A上的{A,B}和PRIMARY KEY上创建一个INDEX而无需在{A}上创建INDEX。