外键约束是数据库中用于建立表与表之间关联关系的一种重要机制。以下是对外键约束的详细讲解:
NULL
。包含外键的表称为子表(或从表),外键所引用的表称为父表(或主表)。在创建表时,可以使用 FOREIGN KEY
关键字来定义外键约束。例如,有两个表 orders
(订单表)和 customers
(客户表),orders
表中的 customer_id
字段是外键,关联到 customers
表的 id
字段(主键),创建表的 SQL 语句如下:
CREATE TABLE customers (
id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(50)
);
CREATE TABLE orders (
id INT PRIMARY KEY,
order_date DATE,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(id)
);
也可以在已存在的表上添加外键约束,使用 ALTER TABLE
语句,示例如下:
NULL
。例如,在 orders
表中插入一条订单记录时,customer_id
必须是 customers
表中已存在的 id
值,否则插入会报错。CASCADE
(级联更新)、RESTRICT
(限制更新,默认值)等。如果设置为 CASCADE
,则父表中主键值更新时,子表中的外键值也会自动更新;如果是 RESTRICT
,则只有当子表中没有相关外键值时,才能更新父表中的主键值。CASCADE
(级联删除)、SET NULL
(将子表外键值设为 NULL
)、RESTRICT
(限制删除)等。例如,设置为 CASCADE
时,删除父表中的客户记录,与之关联的子表 orders
中的相关订单记录也会被自动删除;设置为 SET NULL
,则会将子表中对应外键值设为 NULL
;而 RESTRICT
则在子表有相关记录时,禁止删除父表记录。下面通过一个具体示例,为你展示在有外键约束的情况下如何插入数据,我们以常见的 customers
表和 orders
表为例,orders
表中的 customer_id
是外键,关联 customers
表的 id
字段。
-- 创建 customers 表,存储客户信息
CREATE TABLE customers (
id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(50)
);
-- 创建 orders 表,存储订单信息,customer_id 是外键,关联 customers 表的 id 字段
CREATE TABLE orders (
id INT PRIMARY KEY,
order_date DATE,
customer_id INT,
-- 定义外键约束,命名为 fk_orders_customers
CONSTRAINT fk_orders_customers FOREIGN KEY (customer_id) REFERENCES customers(id)
);
在向子表(orders
表)插入数据之前,必须先向父表(customers
表)插入数据,因为外键约束要求子表中的外键值必须在父表的主键列中存在。
-- 向 customers 表插入一条客户记录
INSERT INTO customers (id, name, email)
VALUES (1, 'John Doe', '[email protected]');
当父表中有了相应的数据后,就可以向子表插入数据了,插入的 customer_id
值必须是 customers
表中已存在的 id
值。
-- 向 orders 表插入一条订单记录,指定 customer_id 为 1,该值必须在 customers 表中存在
INSERT INTO orders (id, order_date, customer_id)
VALUES (1, '2024-01-01', 1);
如果尝试插入一个在父表中不存在的 customer_id
值,数据库会抛出错误,阻止插入操作。
-- 尝试插入一个在 customers 表中不存在的 customer_id 值,会报错
INSERT INTO orders (id, order_date, customer_id)
VALUES (2, '2024-01-02', 2);
外键约束保证了数据的参照完整性,在插入数据时,要先确保父表中有相应的记录,然后子表才能插入关联的数据。违反外键约束的插入操作会被数据库拒绝,从而避免出现孤立的数据。你可以将上述 SQL 代码复制到 MySQL 等支持外键约束的数据库中运行,观察效果。