【MySQL】外键约束

(一)外键约束

  • 外键:是指表中某个字段的值依赖于另一个表中的某个字段的值(被依赖的字段必须要有主键约束或者唯一约束

  • 外键约束:用户实现数据库表的参照完整性。外键约束可以使两张表紧密结合起来,特别是对于删除/修改级联操作时,会保证数据的完整性。

  • 子表/从表:使用外键约束的表 (学生表:学号,姓名,性别,年龄,班级号)

  • 父表/主表:含有被依赖的字段的表(班级表:班级号,班级名)

注意:学生表中含有班级号


(二)外键约束的功能

  • 同一个字段有着大量重复数据,使用外键约束后,修改只修改一次父表中的数据即可,节省时间;

注意:外键约束只有表级约束


(三)学生表和班级表

(1)练习
-- 创建主表(班级表)
create table class_table(
	c_id int(4) primary key auto_increment,
	c_name varchar(10)
);


-- 创建从表(学生表)
create table stu_table(
	s_id int PRIMARY key auto_increment,
	s_name varchar(10) not null,
	s_sex char(1) check(s_sex = '男' or s_sex = '女'),
	s_age int(3) check(s_age > 0 and s_age < 100),
	c_id int(4) 
);


-- 班级表添加数据
insert into class_table values(NULL, 'xg1901'), (NULL, 'xg1902');

-- 查看班级表数据
select * from class_table;

-- 学生表中插入数据
insert into stu_table values (NULL, '香菱', '女', 18, 1);
insert into stu_table values (NULL, '行秋', '男', 18, 2);
insert into stu_table values (NULL, '胡桃', '女', 16, 2);
insert into stu_table values (NULL, '班尼特', '男', 18, 1);
-- 查看学生表数据
select * from stu_table;

在这里插入图片描述

在这里插入图片描述

(2)两个问题
  1. 问题一:班级表中只有1, 2 ,那我们在学生表中插入3班学生呢?
    insert into stu_table values (NULL, '测试名', '女', 18, 3 );

在这里插入图片描述
结果很明显添加成功,但这种做法就是错误的,因为根本没有c_id = 3的班

  1. 问题二:那我们删除班级表中的一条记录呢,那2班的人怎么办?
    比如:删除xg1902
    delete from class_table where c_id = 2;
    在这里插入图片描述
    那么学生表中c_id = 2的学生有没有被删除呢??很显然并没有
    在这里插入图片描述
(3)解决方案
  • 产生原因:未将外键约束语法添加进去

  • 添加外键约束(只有表级约束):

1.创建表时添加表级外键约束
语法:constraint 约束名 foreign key 子表名 (子表字段名) references 父表名 (父表唯一字段名)

-- 创建从表(学生表)
create table stu_table(
	s_id int PRIMARY key auto_increment,
	s_name varchar(10) not null,
	s_sex char(1) check(s_sex = '男' or s_sex = '女'),
	s_age int(3) check(s_age > 0 and s_age < 100),
	c_id int(4),
	
	-- 创建时添加表级外键约束
	constraint fk_c_id  foreign key (c_id) references class_table (c_id)
);

在这里插入图片描述

2.对已创建的表添加表级外键约束
alter table 子表名 add constraint 约束名 foreign key 子表名 (子表字段名) references 父表名 (父表唯一字段名);

-- 已存在的表添加表级外键约束
alter table stu_table add constraint fk_c_id  foreign key (c_id) references class_table (c_id);
(4)结果展示

在这里插入图片描述
在这里插入图片描述


(四)外键策略

(1)策略一:手动置空

在这里插入图片描述

(2)策略二:级联操作 on update on delete

创建约束 外键策略;

什么是级联呢?

开启级联后,更新/删除一个主表的主键值(唯一字段),系统会相应的更新/删除所有从表匹配的外键值。

先删除旧的外键约束,在添加含有外键策略(级联操作)的外键约束

  • 语法格式:
-- 1.先删除旧的外键约束
alter table 从表名 drop foreign key 外键约束名;

-- 2.重新添加带有级联操作(更新/删除)的外键约束
alter table 从表名 add constraint 外键约束名 foreign key (从表字段名) references 主表名 (主表字段名) on update cascade on delete cascade;
  • 示例:
-- 1.先删除旧的外键约束
alter table stu_table drop foreign key fk_c_id;

-- 2.重新添加带有级联操作(更新/删除)的外键约束
alter table stu_table add constraint fk_c_id foreign key (c_id) references class_table (c_id) on update cascade on delete cascade;

-- 级联更新
update class_table set c_id = 1 where c_id = 3;

-- 级联删除
delete from class_table where c_id = 2;

在这里插入图片描述

(3)级联置空 set null

举个例子,学生表中有4个2班的学生, 班级表有1班和2班,假设删除班级表中的2班,出现的情况如下:

  • 外键约束的外键策略set null:学生表中的所有2班学生的班级号为null
  • 46
    点赞
  • 256
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: MySQL外键约束是指在一个表中定义的一个列或多个列与另一个表中的一个列或多个列之间的关系。这种关系可以用于保证数据的完整性和一致性,即在更新或删除数据时能够自动处理相关联的数据,避免数据的不一致性和错误。 在 MySQL 中,可以通过以下步骤来创建外键约束: 1. 创建两个表,并在其中一个表中定义一个列或多个列作为外键列,这些列将与另一个表中的列建立关系。 2. 在定义外键列的表中,使用 FOREIGN KEY 关键字来指定外键列,并使用 REFERENCES 关键字来指定另一个表中的列。 3. 在定义外键列的表中,使用 ON DELETE 和 ON UPDATE 子句来定义在删除或更新相关行时如何处理外键约束。可以指定的选项包括 CASCADE、SET NULL、RESTRICT 和 NO ACTION。 例如,以下 SQL 语句用于创建一个名为 "orders" 的表和一个名为 "customers" 的表,并在 "orders" 表中定义一个名为 "customer_id" 的外键列,该列与 "customers" 表中的 "id" 列建立关系: ``` CREATE TABLE customers ( id INT(11) NOT NULL AUTO_INCREMENT, name VARCHAR(50) NOT NULL, PRIMARY KEY (id) ); CREATE TABLE orders ( id INT(11) NOT NULL AUTO_INCREMENT, customer_id INT(11) NOT NULL, order_date DATE NOT NULL, total_price DECIMAL(10,2) NOT NULL, PRIMARY KEY (id), FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE CASCADE ON UPDATE CASCADE ); ``` 在上面的例子中,外键约束指定了当在 "customers" 表中删除或更新一行时,对应的 "orders" 表中的行应该怎样处理。由于指定了 ON DELETE CASCADE 和 ON UPDATE CASCADE 选项,当在 "customers" 表中删除或更新一行时,与该行相关的 "orders" 表中的行也将被删除或更新。 ### 回答2: MySQL外键约束是一种用于保持数据完整性和一致性的约束。它定义了表之间的关联关系,确保在一个表中的数据引用另一个表的关联字段时,另一个表中必须存在对应的数据。 外键约束在创建表时通过在一个或多个字段上添加FOREIGN KEY关键字来定义。这些字段通常被称为外键。被引用的表被称为主表或父表,包含外键的表被称为子表或从表。 外键约束可以确保数据的完整性,例如防止在子表中插入无效的外键值。如果尝试在子表中插入一个在主表中不存在的外键值,MySQL会报错并拒绝插入操作。这可以防止引用不存在的数据,避免数据的不一致性。 另外,当主表中的数据被删除或更新时,外键约束还可以实现级联操作。可以定义为当主表中的数据被删除或更新时,子表中对应的数据也会被删除或更新。这样可以确保数据的关联性和一致性。 需要注意的是,使用外键约束会增加数据库的查询和更新操作的开销,因为数据库需要验证外键的正确性。此外,外键约束只能在InnoDB存储引擎下使用,对于其他存储引擎如MyISAM等不支持。 总的来说,MySQL外键约束是一种重要的数据完整性保障机制,可以确保表之间的关联关系和数据的一致性。但同时也需要权衡性能影响,根据具体业务需求进行合理应用。 ### 回答3: MySQL中的外键约束是一种用于确保关系数据库中数据完整性的手段。外键是一个字段或一组字段,用于关联两个表中的数据。 外键约束是通过在被关联表中创建一个外键指向主表的主键来实现的。当在被关联表中插入数据时,数据库会检查该字段的值是否存在于主表中。如果不存在,则会报错并拒绝插入操作。 外键约束有以下几个作用: 1. 数据完整性:外键约束可以确保表之间的关系是有效的,避免了数据的不一致性和冗余。 2. 数据关联:外键约束可以通过关联两个表中的数据,方便进行数据查询和操作。 3. 数据一致性:外键约束可以确保数据在插入、更新或删除时的一致性,避免了数据的不一致性问题。 除了上述作用之外,外键约束还可以实现级联操作,即对主表的一项操作会影响到关联的从表。常见的级联操作有: 1. 级联更新:当主表的主键更新时,关联的从表中的外键值也会相应更新。 2. 级联删除:当主表的主键被删除时,关联的从表中的相关数据也会被删除。 需要注意的是,使用外键约束需要满足以下条件: 1. 被关联表和关联表必须使用InnoDB存储引擎,因为只有InnoDB引擎才支持外键约束。 2. 被关联的字段类型和长度必须与主表的主键字段类型和长度一致。 3. 在创建外键约束之前,必须先创建主表。 总的来说,MySQL中的外键约束是一种简单、有效的数据完整性保证机制,它可以实现数据间的关联、一致性和级联操作。在数据库设计和使用中,合理地运用外键约束可以提高数据的可靠性和一致性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值