关于sql:表中的复合备用键

Composite alternate key in tables

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


除非我不明白您的想法,否则对于MS SQL来说,很有可能看到这个测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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空


正式地:

  • "超级键"是一组属性,这些属性组合在一起可以唯一地标识行。
  • "key"是一个最小的超键,也就是说,如果您从中去掉任何属性,它将不再是唯一的。

所以在您的示例中:a,b不是键,因为它不是最小的(您可以去掉b,仍然具有唯一性)。

虽然一个典型的DBMS会让您形成一个"包含"主键的独特约束,但这不是一个好主意——您违反了数据库设计原则,即"所有东西都应该依赖于一个键、整个键,而不是键"。

顺便问一下,你为什么要做这样的事?出于性能原因,您只是想避免有两个索引(on a和on a,b)吗?如果是这样,请记住"索引"和"键"是两个独立的概念——前者与物理/性能相关,而后者是逻辑的。索引经常支持键(出于性能原因),这一事实不应该模糊这一区别。

根据DBMS的不同,您可能可以在A、B上装入索引,而不必在A_上装入索引。