表中的复合备用键

问题描述 投票:2回答:2

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

sql alternate
2个回答
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


2
投票

形式上:

  • “超级密钥”是一组属性,它们一起能够唯一地标识行。
  • “密钥”是一个最小的超级密钥 - 即如果你从中删除任何属性,它将不再是唯一的。

所以在你的例子中:{A,B}不是一个关键,因为它不是最小的(你可以带走B并且仍然具有唯一性)。

虽然典型的DBMS会让你创建一个“包含”PRIMARY KEY的UNIQUE约束,但这不是一个好主意 - 你违反了数据库设计原则,即“一切都应该依赖于密钥,整个密钥而不是密钥”。


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

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

© www.soinside.com 2019 - 2024. All rights reserved.