键是一组列,可用于唯一标识表中的每一行。
每个表至少有一个键。假设我们已经确定了表的每个可能键。这些键中的每一个都是候选键。
当我们检查这些键中的每一个时,键可能不包含列 (!)、一列或多于一列,当它们一起考虑时,它们可以唯一地标识每一行。术语复合键特指由多于一列组成的键。
在 SQL 中,决定应该选择一个键并将其视为比表的其他键“更平等”。这个键称为主键。也可以在表上声明其他键,这些通常称为唯一约束。
(!) 在 SQL 中,不允许声明没有列的键 - 尽管它有时会很有用(想想应该只有一行的表,其中每列代表配置信息)
作为具有多个键的表的示例,所有键都是复合的。想象一个预约系统,客户和顾问在特定时间在一个房间会面:
CREATE TABLE Appointments (
ClientID int not null,
CounsellorID int not null,
RoomID int not null,
AppointmentTime datetime not null
)
此表的候选键是 {ClientID,AppointmentTime}、{CounsellorID,AppointmentTime} 和 {RoomID,AppointmentTime}。任何这些列组合都可以用来唯一标识表中的一行,并且它们都是复合键。
我们选择将哪个声明为主键将(可能)取决于我们自己对系统主要“焦点”的解释。我们主要关心房间的使用,还是客户,还是顾问?在任何情况下,我们都会选择一个并将其声明为主键。我们还希望将其他键声明为唯一约束。
或者,我们可以决定使用代理,并声明一个AppointmentID 列,使用数据库中可用的任何自动编号工具。那可能是(非复合)主键。但是我们仍然应该为表声明其他键。