外键的定义与作用
外键是一个表中的一列或多列,其值必须与另一个表(通常称为主键表或父表)中的主键值相匹配,或者为空值。外键的主要作用是维护表之间的数据一致性和引用完整性,防止在相关表中插入或更新无效的数据。
创建外键
在创建表时或者在已有表上添加外键约束,都可以定义外键。
创建表时定义外键
下面的示例创建了两个表:`departments`(部门表)和 `employees`(员工表),并在 `employees` 表中定义了一个外键关联到 `departments` 表的 `dept_id` 列。
sql
-- 创建部门表
CREATE TABLE departments (
dept_id INT PRIMARY KEY,
dept_name VARCHAR(50)
);
-- 创建员工表并定义外键
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
emp_name VARCHAR(50),
dept_id INT,
-- 定义外键约束
FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);
在已有表上添加外键
若表已经创建好,可使用 `ALTER TABLE` 语句添加外键约束。
sql
-- 为 employees 表添加外键约束
ALTER TABLE employees
ADD CONSTRAINT fk_employees_departments
FOREIGN KEY (dept_id) REFERENCES departments(dept_id);
删除外键
若要删除外键约束,可使用 `ALTER TABLE` 语句。
sql
-- 删除 employees 表的外键约束
ALTER TABLE employees
DROP FOREIGN KEY fk_employees_departments;
外键的级联操作
当父表中的记录被删除或更新时,可通过设置外键的级联操作来自动处理子表中的相关记录。常见的级联操作有 `ON DELETE` 和 `ON UPDATE`。
级联删除(`ON DELETE CASCADE`)
当父表中的记录被删除时,子表中与之关联的记录也会被自动删除。
sql
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
emp_name VARCHAR(50),
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
ON DELETE CASCADE
);
级联更新(`ON UPDATE CASCADE`)
当父表中的主键值被更新时,子表中与之关联的外键值也会被自动更新。
sql
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
emp_name VARCHAR(50),
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
ON UPDATE CASCADE
);
使用外键的注意事项
- **性能影响**:外键约束会增加数据库的维护开销,特别是在插入、更新和删除操作时,可能会影响性能。
- **数据完整性**:外键可以保证数据的引用完整性,但在使用级联操作时要谨慎,避免意外删除或更新数据。
- **表结构设计**:在设计表结构时,应合理使用外键来建立表之间的关联,避免出现循环引用或复杂的外键关系。