Mysql外键约束

外键约束

  • 约束
    约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性
  • 外键约束
    建立表与表之间的某种约束关系,因为这种关系的存在,能够让表与表之间的数据,更加的完整,关联性更强
    例:
# 创建部门表
create table dept (
	id int primary key auto_increment,
	dname varchar(50) not null);
# 创建人员表
create table person(
	id int primary key auto_increment,
	name varchar(32) not null,
	age tinyint default 0,
	sex enum('m','w','o') default 'o',
	salary decimal(8,2) DEFAULT 250.00,
    hire_date date NOT NULL,
    dept_id int
);

在上面创建的员工表和部门表中。每个员工实际都有一个部门,如果在没有约束的情况下,人员是可以没有部门或者添加一个不存在的部门的。这样数据就会出现错误,此时,就应该添加外键约束,来保证数据的完整性和正确性。
foreign key 外键的定义语法:

# 该语法可以在 创建表 和 修改表 时使用
[constraint 外键名称] foreign key (外键字段) 
references 主表表名(主表外键)
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}]		# 级联动作,后续有写

[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}]
  • 主表和从表:若同一个数据库中,B表的外键与A表的主键相对应,则A表为主表,B表为从表。
    则在上面创建的表中,部门表为主表,员工表为从表(员工表中的外键部门id与部门表中的主键id对应)。
# 创建表时之间建立外键
CREATE TABLE person (
  id int PRIMARY KEY AUTO_INCREMENT,
  name varchar(32) NOT NULL,
  age tinyint DEFAULT 0,
  sex enum('m','w','o') DEFAULT 'o',
  salary decimal(10,2) DEFAULT 250.00,
  hire_date date NOT NULL,
  dept_id int ,
  constraint dept_fk foreign key(dept_id)  references dept(id);# 创建外键约束
# 建立表后增加外键
alter table person 
add constraint dept_fk 
foreign key(dept_id) references dept(id);
注意
  1. 并不是任何情况表关系都需要建立外键来约束
  2. 从表的外键字段数据类型与指定的主表的数据类型应该相同
  • 解除外键约束
alter table person drop foreign key dept_fk  # dept_fk为外键名
注意:

删除外键后发现desc查看索引标志还在,如下图,这是因为外键也是一种索引,需要将外键名称的索引删除后才可以。
在这里插入图片描述

  • 级联动作:

概述:创建外键约束时设置主表与从表在删除或者更新时会产生的一系列操作

  1. restrict(默认)
    on delete restrict:当主表删除记录时,如果从表中有相关的记录则不允许删除
    on update restrict:当主表更改主键字段值时,如果从表中有相关的记录则不允许更改
  2. cascade 数据级联更新
    on delete cascade, on update cascade:当主表删除记录或更改被参照字段的值是,从表会级联更新
  3. set null
    on delete set null:当主表删除字段时,从表外键字段值变为null
    on delete set null:当主表更改主键字段值时,从表外键字段值变为null
  4. no action
    同restrict,都是立即检查外键限制
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

臭屁范

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值