目录

  1. FOREIGN KEY 约束简介
  2. FOREIGN KEY 约束的语法
  3. FOREIGN KEY 约束的使用场景
  4. FOREIGN KEY 约束的注意事项
  5. 参考资料

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_idproduct_id 共同作为主键,并且它们各自是外键,分别引用 orders 表的 order_idproducts 表的 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 约束的使用场景

  1. 建立表之间的关联
    • 外键用于在不同表之间建立逻辑关系。例如,在 orders 表中,customer_id 外键引用 customers 表中的主键,建立了订单和客户之间的关系。
  2. 确保数据一致性
    • 外键约束确保引用数据的有效性。例如,只有在 customers 表中存在的客户,才能在 orders 表中作为 customer_id 被引用。这防止了插入无效或不存在的数据。
  3. 级联操作
    • 外键还可以设置级联操作,如 CASCADESET NULLNO ACTION,用于在主表数据更新或删除时自动同步更新或删除从表数据。例如,当删除客户时,可以通过级联删除所有相关订单。

FOREIGN KEY 约束的注意事项

  1. 引用的数据必须存在
    • 外键列中的数据必须在被引用的主键列中存在,否则插入或更新会失败。例如,在 orders 表插入数据时,customer_id 必须在 customers 表中存在。
  2. 不能插入 NULL 值(除非允许)
    • 外键列通常不允许插入 NULL 值,除非你明确允许它。通常情况下,外键列的数据应对应主键列中的有效值。
  3. 级联操作
    • 外键约束支持级联操作,可以设置当主表数据被删除或更新时,从表数据如何自动响应。常见的级联操作有:
      • CASCADE:主表数据删除或更新时,从表数据也会删除或更新。
      • SET NULL:主表数据删除或更新时,从表对应列设置为 NULL
      • NO ACTIONRESTRICT:主表数据删除或更新时,阻止从表数据的删除或更新,保证数据完整性。
  4. 性能问题
    • 外键约束会对插入、更新和删除操作的性能产生一定影响,因为数据库需要验证数据是否符合外键约束。
  5. 一个表只能有一个主键,但可以有多个外键
    • 虽然一个表只能有一个主键,但可以有多个外键引用其他表的主键。

参考资料