主键(Primary Key)和候选键(Candidate Key)是关系型数据库中的术语,用于标识和唯一确定表中的记录。它们之间有以下区别:
唯一性:主键是表中的唯一标识,每个表只能有一个主键,而候选键是可以作为主键的备选项,并且每个候选键也必须具有唯一性。
空值(NULL):主键不允许包含空值(NULL),也就是说,主键必须在每个记录中都有一个非空值。而候选键可以包含空值或重复值。
唯一标识性:主键用于唯一地标识表中的每个记录,确保每个记录具有唯一的标识符。候选键也具有唯一性,但它们可能会被用作其他目的,如参照外键或用于数据的逻辑关联。
选择性:主键是必选的,也就是说,每个记录必须具有主键值。而候选键可以被选择性地用作主键,当然,前提是满足唯一性和非空的要求。
需要注意的是,候选键可能包含多个列,这种情况下称为复合候选键(Composite Candidate Key)。复合候选键要求组合键的值在全表中都是唯一的,但单独的每一列可能不满足唯一性。
综上所述,主键在关系型数据库中具有特殊的作用,用于标识和唯一确定表中的记录,而候选键是可以代替主键的备选项,但它们需要满足唯一性和非空性的要求。
要创建主键,可以在表的创建过程中或表已存在时使用 ALTER TABLE
语句来指定主键约束。下面是几种常见的创建主键的示例代码:
在表的创建过程中指定主键:
-- 创建一个学生表,并指定主键
CREATE TABLE students (
student_id INT PRIMARY KEY,
student_name VARCHAR(50) NOT NULL,
student_email VARCHAR(50),
student_age INT,
student_major VARCHAR(50)
);
上述代码中,student_id
列被指定为主键。
在表已存在时使用 ALTER TABLE
添加主键约束:
-- 在已存在的表上添加主键约束
ALTER TABLE students
ADD CONSTRAINT pk_students PRIMARY KEY (student_id);
上述代码中,students
表已存在,并使用 ALTER TABLE
语句添加了名为 pk_students
的主键约束,该主键由 student_id
列组成。
无论是在表的创建过程中还是在已存在的表上使用 ALTER TABLE
添加主键约束,都需要指定主键所涉及的列,并为主键指定一个名称(可选)。
创建主键约束后,数据库会自动确保被指定为主键的列包含唯一的、非空的值。如果试图插入具有相同主键值的记录或将空值插入主键列,则会导致插入失败或触发错误。
在关系型数据库中,候选键是能够唯一标识每行数据的一组列。它们可以由一个或多个列组成。以下是创建候选键的示例代码:
在表的创建过程中指定候选键:
-- 创建一个员工表,并指定候选键
CREATE TABLE employees (
employee_id INT,
employee_name VARCHAR(50) NOT NULL,
employee_email VARCHAR(50) UNIQUE,
employee_department VARCHAR(50),
employee_salary DECIMAL(10, 2),
CONSTRAINT uk_employee_email_department UNIQUE (employee_email, employee_department)
);
上述代码中,候选键由 employee_email
和 employee_department
列组成。通过 CONSTRAINT
关键字,我们在表的创建过程中指定了候选键的约束,并为候选键指定了名称 uk_employee_email_department
。
在已存在的表上使用 ALTER TABLE
添加候选键约束:
-- 在已存在的表上添加候选键约束
ALTER TABLE employees
ADD CONSTRAINT uk_employee_email_department UNIQUE (employee_email, employee_department);
上述代码中,employees
表已存在,并使用 ALTER TABLE
语句添加了名为 uk_employee_email_department
的候选键约束,该候选键由 employee_email
和 employee_department
列组成。
无论是在表的创建过程中还是在已存在的表上使用 ALTER TABLE
添加候选键约束,都需要指定候选键所涉及的列,并为候选键指定一个名称(可选)。
候选键约束确保候选键所涉及的列数据的组合是唯一的。这意味着不允许插入重复的候选键组合值。