关于MySQL的外键Foreign Key(删除的问题)

MySQL中的外键

什么是外键?

如果公共关键字在一个关系中是关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表
以上是百科解释…
在这里插入图片描述
萌新表示…啊…这…
下面用例子解释👇

学生表:

学号姓名性别家庭住址班级
1001张三xxxxx001
1002张三xxxxx001
1003张三xxxxx002

班级表

班级班名班主任
001高(1)一班张xx
002高(1)二班羊xx

学生表中学号为主键,班级表中班级为主键 。学生必定来自某个班级,所以学生表中的班级编号必须是班级表中的班级编号,此时学生表中的班级编号即称之为学生表的外键

如何添加外键?

外键的添加方式分为三种:①列级 ②行级 ③表级

1.列级

直接在创建表时跟在对应列后面。
但是!👉mysql不支持这种语法

CREATE TABLE Orders
(
Id_O int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
Id_P int FOREIGN KEY REFERENCES Persons(Id_P)
)
2.行级

全部列后面创建

CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
PRIMARY KEY (Id_O),
FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
)
3.表级

有人会问 如果我的表已经建立了但是忘了加外键怎么办?这不,表级就来了。
使用alter进行追加

ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)

其中 fk_Per0rders 为键名(自定义)
此方法有个好处就是方便删除外键,将来设计程序的时候不建议使用外键,会提高程序的耦合度

加上了,那…如何删除外键呢?

alter table 表名 drop foreign key 约束名(键名); 就这样简单、粗暴就完了?
看下例👇
在这里插入图片描述
已经提前插入外键,上图可以看出 mul ,然后我们删除👇


why? 是我们没删掉么???

no!
原因在这👉:在创建外键的时候系统会自动添加一个同名索引
也就是说此时其实已经没有外键约束了,但是由于索引还在,所以依然会显示,但是两张表已经独立了。
那么能去掉mul么??? 当然可以,在删掉外键的基础上,删除索引即可。
语句:drop index 索引名 on 表名 这样就彻底干净了

结束语

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 表中的行没有被引用时,才允许更新。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值