mysql外键(foreign key)

简介

MySQL的外键约束用来在两个表数据之间建立链接,其中一张表的一个字段被另一张表中对应的字段约束。也就是说,设置外键约束至少要有两种表,被约束的表叫做从表(子表),另一张叫做主表(父表),属于主从关系。

表格说明

现在有两张表my_class(主表)、my_stu(从表),主表与从表通过id连接。
创建表的sql语句:

#主表
CREATE table my_class(
	id int PRIMARY KEY,
	`name` VARCHAR(32) not null
)
#从表
CREATE table my_stu(
	id int PRIMARY KEY,
	`name` VARCHAR(32),
	class_id int ,
	foreign key(class_id) REFERENCES my_class(id)
)

外键是怎么来体现约束的呢?

1.从表插入数据时,主表中一定要有对应的外键。
my_class表(主表):

id(主键)name
1小班
2中班
3大班
insert into my_stu(id,name,class_id) values(1,"小花",4); #错误,class_id=4在主表中找不到对应的id=4
insert into my_stu(id,name,class_id) values(1,"小花",3); #正确,符合外键约束规范,主表中存在id=3

2.主表数据删除时,一定要确保从表中没有与删除数据相关联的数据。
比如现在存在my_stu表:

id(主键)nameclass_id(外键)
1小花1
2小红2
3小张3

因为从表中存在(1,小花,1),所以下面的删除会报错。

delete from my_class where id=1; #错误

应当先删除从表中关联数据,再删除主表中的数据。

delete from my_stu where class_id=1;#删除从表关联数据
delete from my_class where id=1; 

注意事项

  1. 外键指向的主表字段要求是primary key或unique
  2. 表必须为innodb,才支持外键
  3. 外键与主键类型需一致
  4. 外键可以为null,为null时主表中可以不存在对应的null。
MySQL 外键约束可以用来保证表与表之间的关系完整性。当我们在一个表中定义了一个外键,它会引用另一个表中的列,这个被引用的列必须是另一个表的主键或者是一个唯一键。在 MySQL 中,外键约束可以跨越多个列。 下面是一个例子,演示如何在 MySQL 中定义一个外键约束,跨越两个列: ``` CREATE TABLE orders ( order_id INT PRIMARY KEY, customer_id INT, order_date DATE, FOREIGN KEY (customer_id, order_date) REFERENCES customers(id, date) ); ``` 在这个例子中,orders 表中的 customer_id 和 order_date 列都被用来定义外键约束,它们分别引用了 customers 表中的 id 和 date 列。这个外键约束确保了 orders 表中的每一行都有对应的 customers 表中的行,而且这个关联是基于 customer_id 和 order_date 两列的值。 在定义外键约束时,我们还可以指定 ON DELETE 和 ON UPDATE 规则,用来控制当关联表中的某一行被删除或更新时,对应的行应该怎么处理。常用的规则包括: - CASCADE:当关联表中的某一行被删除或更新时,对应的行也会被删除或更新。 - RESTRICT:当关联表中的某一行被删除或更新时,如果该行有对应的行,则不允许删除或更新。 - SET NULL:当关联表中的某一行被删除或更新时,对应的行的外键列会被设置为 NULL。 我们可以在定义外键约束时使用这些规则,例如: ``` CREATE TABLE orders ( order_id INT PRIMARY KEY, customer_id INT, order_date DATE, FOREIGN KEY (customer_id, order_date) REFERENCES customers(id, date) ON DELETE CASCADE ON UPDATE RESTRICT ); ``` 在这个例子中,我们指定了 ON DELETE CASCADE 和 ON UPDATE RESTRICT 规则,表示当 customers 表中的某一行被删除时,对应的 orders 表中的行也会被删除;当 customers 表中的某一行被更新时,只有当 orders 表中的行没有被引用时,才允许更新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值