MySQL:约束-外键

在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中用于维护表之间的参照完整性。通过使用外键,可以确保子表中的数据在父表中是有效的。外键约束可以在表创建时定义,也可以在表创建后添加,还可以定义级联操作来处理父表中记录的删除或更新对子表的影响。外键的使用有助于保持数据库的一致性和完整性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值