外码约束(Foreign Key Constraint)
外码(Foreign Key, FK)是关系数据库中的一个约束,它用于保证表之间的引用完整性。外码的值必须:
要么存在于被引用表的主键列中,要么为空(NULL)。
外码约束的定义
在 SQL 中,可以使用 FOREIGN KEY 语句来定义外码约束。例如:
CREATE TABLE instructor (
ID INT PRIMARY KEY,
name VARCHAR(50),
dept_name VARCHAR(50),
salary FLOAT,
FOREIGN KEY (dept_name) REFERENCES department(dept_name)
);
在这个例子中:
dept_name 是 instructor 关系中的一个外码,它引用 department 关系的 dept_name。
department.dept_name 必须是 PRIMARY KEY
或者 UNIQUE
(UNIQUE:值不能重复,即所有行的 dept_name 都必须是唯一的)这样 instructor 中的 dept_name 才不会引用不存在的部门。
外码约束的影响
外码约束在数据库操作中会影响 插入(INSERT)、删除(DELETE) 和 更新(UPDATE) 操作:
- 破坏外码约束的 INSERT
如果 instructor 表中的 dept_name 是 FOREIGN KEY,那么插入时必须确保 department 表中已经存在该 dept_name。
错误示例(如果 Physics 还未存在于 department 表中):
INSERT INTO instructor (ID, name, dept_name, salary)
VALUES (101, 'Alice', 'Physics', 90000);
如果 department 关系中没有 Physics,则数据库会报错:
ERROR: insert or update on table "instructor" violates foreign key constraint
正确方法(先插入 department 数据):
INSERT INTO department (dept_name, building, budget)
VALUES ('Physics', 'Science Hall', 500000);
INSERT INTO instructor (ID, name, dept_name, salary)
VALUES (101, 'Alice', 'Physics', 90000);
- 破坏外码约束的 DELETE
如果一个 dept_name 被 instructor 表引用,则不能直接删除该 department,否则会破坏外码约束。
错误示例:
DELETE FROM department WHERE dept_name = 'Physics';
如果 instructor 表中仍然有 dept_name = ‘Physics’ 的记录,就会报错:
ERROR: update or delete on table "department" violates foreign key constraint
解决方案:
删除 instructor 关联的记录:
DELETE FROM instructor WHERE dept_name = 'Physics';
DELETE FROM department WHERE dept_name = 'Physics';
使用 ON DELETE CASCADE 级联删除:
CREATE TABLE instructor (
ID INT PRIMARY KEY,
name VARCHAR(50),
dept_name