什么是外键?
外键(Foreign Key, FK)是一种约束,表示一个表的列引用另一个表的主键。外键定义表间关系并保证参照完整性。
ON DELETE选项
- RESTRICT(默认): 存在子记录时拒绝删除父记录
- CASCADE: 删除父记录时同时删除子记录
- SET NULL: 删除父记录时将子记录的FK设为NULL
- NO ACTION: 类似RESTRICT,在事务结束时检查
三种表关系类型
1:1(一对一)关系
CREATE TABLE user_profiles (
user_id UUID PRIMARY KEY, -- 同时是FK和PK(保证1:1)
full_name VARCHAR(200),
bio TEXT,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
1:N(一对多)关系
CREATE TABLE orders (
id UUID PRIMARY KEY,
customer_id UUID NOT NULL, -- FK在N端
total_amount DECIMAL(15, 2) NOT NULL,
FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE RESTRICT
);
CREATE INDEX idx_orders_customer ON orders(customer_id);
N:M(多对多)关系
必须通过中间表实现。
CREATE TABLE enrollments (
student_id UUID NOT NULL,
course_id UUID NOT NULL,
enrolled_at TIMESTAMPTZ DEFAULT NOW(),
grade VARCHAR(2),
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES students(id) ON DELETE CASCADE,
FOREIGN KEY (course_id) REFERENCES courses(id) ON DELETE CASCADE
);
自引用关系
同一表内的记录互相关联。
CREATE TABLE comments (
id UUID PRIMARY KEY,
post_id UUID NOT NULL,
parent_id UUID, -- NULL表示顶级评论
content TEXT NOT NULL,
FOREIGN KEY (parent_id) REFERENCES comments(id) ON DELETE CASCADE
);
总结
外键和关系设计构成了数据库的骨架。理解三种基本关系模式(1:1、1:N、N:M),就能对任何领域的数据进行建模。