目录
FOREIGN KEY 约束简介
FOREIGN KEY
约束是 SQL 中用于建立和维护两张表之间的关系的约束。外键用于确保在一张表中的列(或列组合)引用另一张表中的主键。外键约束确保了数据的完整性,防止插入无效数据或删除正在被其他表引用的数据。
外键是关系型数据库模型的关键特性之一,用于确保数据的规范化与一致性。例如,在一个订单表中,customer_id
可以是外键,引用客户表中的 customer_id
,确保每个订单都对应一个有效的客户。
FOREIGN KEY 约束的语法
1. 创建表时定义 FOREIGN KEY
约束
在创建表时,可以通过 FOREIGN KEY
约束来为一列或多个列定义外键:
CREATE TABLE orders (
order_id INT PRIMARY KEY,
order_date DATE,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
在这个例子中,orders
表中的 customer_id
列是外键,引用了 customers
表中的 customer_id
列,确保每个订单都对应一个有效的客户。
2. 创建复合外键(多个列组合)
外键也可以由多个列组成,称为复合外键。例如,假设我们有一个订单明细表,记录每个订单中的商品信息,并希望确保每个订单中的商品对应有效的订单和产品:
CREATE TABLE order_details (
order_id INT,
product_id INT,
quantity INT,
PRIMARY KEY (order_id, product_id),
FOREIGN KEY (order_id) REFERENCES orders(order_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
在这个例子中,order_id
和 product_id
共同作为主键,并且它们各自是外键,分别引用 orders
表的 order_id
和 products
表的 product_id
。
3. 在已存在的表中添加 FOREIGN KEY
约束
如果表已经存在,并且希望为某一列添加外键约束,可以使用 ALTER TABLE
语句:
ALTER TABLE orders
ADD CONSTRAINT fk_customer
FOREIGN KEY (customer_id) REFERENCES customers(customer_id);
这个语句为 orders
表中的 customer_id
列添加了外键约束,引用了 customers
表中的 customer_id
列。
4. 删除 FOREIGN KEY
约束
如果要删除外键约束,可以使用 ALTER TABLE
语句:
ALTER TABLE orders
DROP CONSTRAINT fk_customer;
这个语句删除了 orders
表中的外键约束 fk_customer
。
FOREIGN KEY 约束的使用场景
- 建立表之间的关联:
- 外键用于在不同表之间建立逻辑关系。例如,在
orders
表中,customer_id
外键引用customers
表中的主键,建立了订单和客户之间的关系。
- 外键用于在不同表之间建立逻辑关系。例如,在
- 确保数据一致性:
- 外键约束确保引用数据的有效性。例如,只有在
customers
表中存在的客户,才能在orders
表中作为customer_id
被引用。这防止了插入无效或不存在的数据。
- 外键约束确保引用数据的有效性。例如,只有在
- 级联操作:
- 外键还可以设置级联操作,如
CASCADE
、SET NULL
和NO ACTION
,用于在主表数据更新或删除时自动同步更新或删除从表数据。例如,当删除客户时,可以通过级联删除所有相关订单。
- 外键还可以设置级联操作,如
FOREIGN KEY 约束的注意事项
- 引用的数据必须存在:
- 外键列中的数据必须在被引用的主键列中存在,否则插入或更新会失败。例如,在
orders
表插入数据时,customer_id
必须在customers
表中存在。
- 外键列中的数据必须在被引用的主键列中存在,否则插入或更新会失败。例如,在
- 不能插入 NULL 值(除非允许):
- 外键列通常不允许插入
NULL
值,除非你明确允许它。通常情况下,外键列的数据应对应主键列中的有效值。
- 外键列通常不允许插入
- 级联操作:
- 外键约束支持级联操作,可以设置当主表数据被删除或更新时,从表数据如何自动响应。常见的级联操作有:
CASCADE
:主表数据删除或更新时,从表数据也会删除或更新。SET NULL
:主表数据删除或更新时,从表对应列设置为NULL
。NO ACTION
或RESTRICT
:主表数据删除或更新时,阻止从表数据的删除或更新,保证数据完整性。
- 外键约束支持级联操作,可以设置当主表数据被删除或更新时,从表数据如何自动响应。常见的级联操作有:
- 性能问题:
- 外键约束会对插入、更新和删除操作的性能产生一定影响,因为数据库需要验证数据是否符合外键约束。
- 一个表只能有一个主键,但可以有多个外键:
- 虽然一个表只能有一个主键,但可以有多个外键引用其他表的主键。
发表回复