在MySQL中,外键(FOREIGN KEY)是一种用于在两个表之间建立关联的约束,用来确保数据的一致性和完整性。外键约束确保在子表(外键表)中的值在父表(主表)中是有效的,通常用于维护表之间的参照完整性。
一、创建表时定义外键
在创建表时,可以使用`FOREIGN KEY`关键字来定义外键约束。
示例:创建带外键约束的表
假设我们有两个表:`orders`和`customers`。`orders`表中的`customer_id`列是一个外键,引用`customers`表中的`id`列。
create table tb_customers
(
customer_id int primary key,
name varchar(50) not null,
phone_number varchar(15) null,
address varchar(255) null,
postal_code varchar(10) null
) default charset = utf8;
create table orders
(
order_id INT auto_increment primary key,
customer_id INT not null,
order_date DATETIME default current_timestamp,
status ENUM ('Pending', 'Completed', 'Cancelled', 'Shipped') not null,
total_amount DECIMAL(10, 2) not null,
shipping_address VARCHAR(255) not null,
payment_method VARCHAR(50) not null,
tracking_number VARCHAR(50),
created_at TIMESTAMP default current_timestamp,
updated_at TIMESTAMP default current_timestamp on update current_timestamp,
foreign key (customer_id) references tb_customers (customer_id)
) default charset = utf8;
在这个示例中:
`customers`表包含`id`和`name`列,其中`id`列是主键。
`orders`表包含`id`、`order_date`和`customer_id`列。
`customer_id`列是外键,引用`customers`表的`id`列。
二 、表创建后添加外键
如果表已经创建,可以使用`ALTER TABLE`语句添加外键约束。
alter table tb_employees
add constraint fk_department foreign key (department_id) references tb_department (department_id);
在这个示例中,我们为`td_employees`表的`department_id`列添加了一个名为`fk_department`的外键约束,引用`td_department`表的`id`列。
四、 删除外键
可以使用`ALTER TABLE`语句删除外键约束。
alter table tb_employees
drop foreign key fk_department;
在这个示例中,我们删除了`td_employees`表上的`fk_department`外键约束。
五、外键的级联操作
在定义外键时,可以指定级联操作,如`ON DELETE`和`ON UPDATE`。这些操作定义了当父表中的记录被删除或更新时子表中对应记录的行为。
`CASCADE`: 自动删除或更新子表中的匹配记录。
`SET NULL`: 将子表中的外键列设置为`NULL`。
`RESTRICT`: 拒绝删除或更新父表中的记录。
`NO ACTION`: 与`RESTRICT`相同,立即检查外键约束。
示例:定义带级联操作的外键
create table orders
(
order_id INT auto_increment primary key,
customer_id INT not null,
order_date DATETIME default current_timestamp,
status ENUM ('Pending', 'Completed', 'Cancelled', 'Shipped') not null,
total_amount DECIMAL(10, 2) not null,
shipping_address VARCHAR(255) not null,
payment_method VARCHAR(50) not null,
tracking_number VARCHAR(50),
created_at TIMESTAMP default current_timestamp,
updated_at TIMESTAMP default current_timestamp on update current_timestamp,
foreign key (customer_id) references tb_customers (customer_id)
on delete cascade
on update cascade
) default charset = utf8;
在这个示例中:
`ON DELETE CASCADE`: 如果`td_customers`表中的一条记录被删除,那么所有引用该记录的`td_orders`表中的记录也会被自动删除。
`ON UPDATE CASCADE`: 如果`td_customers`表中的`id`列的值被更新,那么所有引用该值的`td_orders`表中的`customer_id`列的值也会被自动更新。
六、总结
外键约束在MySQL中用于维护表之间的参照完整性。通过使用外键,可以确保子表中的数据在父表中是有效的。外键约束可以在表创建时定义,也可以在表创建后添加,还可以定义级联操作来处理父表中记录的删除或更新对子表的影响。外键的使用有助于保持数据库的一致性和完整性。