2021-03-08 19:59:34
SQL中的键用于唯一标识表中的行、加强表间关系并维护数据完整性,主要类型包括主键、外键、候选键、复合键、备用键、唯一键、超级键和代理键,具体说明如下:
主键唯一标识表中每条记录,不可为NULL,每个表仅能有一个主键。例如:
CREATE TABLE 学生 ( StudentID INT PRIMARY KEY, -- 主键 名称 VARCHAR(50), 年龄 INT);StudentID作为主键,确保每个值唯一且非空。
外键在两个表间建立关系,指向另一表的主键,强制引用完整性。例如:
CREATE TABLE 课程 ( CourseID INT PRIMARY KEY, -- 主键 课程名称 VARCHAR(50));CREATE TABLE 注册 ( EnrollmentID INT PRIMARY KEY, 学生ID INT, 课程ID INT, FOREIGN KEY (CourseID) REFERENCES 课程(CourseID) -- 外键);注册表中的CourseID引用课程表的主键,确保数据一致性。
候选键可唯一标识表中行的列或列组,一张表可有多个候选键,但仅能选其一为主键。例如:
CREATE TABLE 员工 ( EmployeeID INT, -- 候选键 电子邮件 VARCHAR(100), -- 候选键 名称 VARCHAR(50), PRIMARY KEY (EmployeeID) -- 选择为主键);EmployeeID和电子邮件均可唯一标识行,但仅EmployeeID被选为主键。
复合键由两列或多列共同组成的主键,唯一标识表中的一行。例如:
CREATE TABLE 订单 ( 订单ID INT, 产品ID INT, 数量 INT, PRIMARY KEY (订单ID, 产品ID) -- 复合键);订单ID和产品ID的组合确保唯一性,单独任一列可能无法满足。
备用键未被选为主键的候选键。例如:
CREATE TABLE 车辆 ( VehicleID INT PRIMARY KEY, -- 主键 LicensePlate VARCHAR(50), -- 备用键 所有者名称 VARCHAR(50));LicensePlate是候选键,但未被选为主键,因此为备用键。
唯一键确保列或列组中所有值唯一,但允许NULL值。例如:
CREATE TABLE 用户 ( 用户ID INT PRIMARY KEY, 电子邮件 VARCHAR(100) UNIQUE, -- 唯一键 用户名 VARCHAR(50));电子邮件列通过UNIQUE约束确保唯一性,但允许NULL值。
超级键一组可唯一标识行的列,候选键是最小超级键(不可删除任何列而不破坏唯一性)。例如:
在员工表中,(EmployeeID, 电子邮件)是超级键,但单独的EmployeeID或电子邮件也可能是超级键(若它们本身已唯一)。
候选键是超级键的子集,例如EmployeeID作为候选键,其本身也是超级键。
代理键无实际业务意义的人工键,通常由系统生成(如自动递增整数)。例如:
CREATE TABLE 订单 ( OrderID INT AUTO_INCREMENT, -- 代理键 产品名称 VARCHAR(50), 数量 INT, PRIMARY KEY (OrderID));OrderID由数据库系统自动生成,仅用于唯一标识记录,无业务含义。
总结:
这些键共同确保数据库的数据完整性、关系一致性和查询效率。