假设一个表有 4 列 A、B、C 和 D。只有 A 列定义了唯一性,这就是它是主键的原因。B、C 和 D 允许条目重复,这就是我们不能将它们作为复合备用键的原因。是否可以在主键和备用键中使用同一列,例如,将备用键作为(A 和 B)?
问问题
10700 次
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 空
5 空
6 空
于 2011-09-11T07:05:19.913 回答
2
正式地:
- “超级键”是一组属性,它们合在一起能够唯一标识行。
- “密钥”是最小的超级密钥——即,如果您从中删除任何属性,它将不再是唯一的。
因此,在您的示例中: {A, B}不是键,因为它不是最小的(您可以拿走 B 并且仍然具有唯一性)。
虽然一个典型的 DBMS会让你创建一个“包含”主键的唯一约束,但这不是一个好主意——你会违反数据库设计原则,即“一切都应该依赖于一个键、整个键,除了键之外什么都没有”。
顺便说一句,你为什么要做这样的事情呢?出于性能原因,您是否只是试图避免使用 2 个索引(在 {A} 和 {A,B} 上)?如果是这样,请记住“索引”和“键”是两个独立的概念——前者是物理/性能相关的,而后者是逻辑的。索引通常支持键(出于性能原因)这一事实不应模糊这种区别。
根据您的 DBMS,您可能能够在 {A, B} 上创建一个 INDEX,在 A 上创建 PRIMARY KEY,而不必在 {A} 上创建 INDEX。
于 2011-09-11T08:09:16.483 回答