绕过外建约束drop table or delete row

禁用MySQL外键约束
本文介绍了一种在MySQL中临时禁用外键约束的方法,以便进行表或数据的删除操作。通过设置`foreign_key_checks`参数为0来关闭外键检查,执行删除操作后,再将其设置回1以恢复外键约束。
外键关联表在开发中很常见,经常遇到要删除一个表或者一行数据时因为有外键关联,删除的时候是不能通过的,但我就是想删除,怎么办呢,5.x之后,MySQL提供了一个办法,将外键约束给关闭了:
mysql> SET foreign_key_checks = 0;
mysql> drop table or delete row...
mysql> SET foreign_key_checks = 1;
foreign_key_checks设置为0时,外键约束就关闭啦,设置为1外键约束又回来啦!这个有时候用起来挺方便的。  

转载于:https://my.oschina.net/javaTechLover/blog/341649

在 MySQL 中执行 `DROP TABLE Student CASCADE` 语句时出现 `ERROR 1217 (23000) Cannot delete or update a parent row: a foreign key constraint fails` 错误,这意味着要删除的 `Student` 表是其他表的父表,存在键引用,直接删除会破坏约束。以下是几种解决办法: ### 方法一:先删除关联表 找出引用了 `Student` 表的子表,先删除这些子表,再删除 `Student` 表。可以通过以下 SQL 查询找出引用了 `Student` 表的约束: ```sql SELECT TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_NAME = 'Student'; ``` 执行上述查询后,会得到引用了 `Student` 表的子表信息。然后依次删除这些子表,最后删除 `Student` 表: ```sql -- 删除子表 DROP TABLE IF EXISTS ChildTable1; DROP TABLE IF EXISTS ChildTable2; -- 最后删除 Student 表 DROP TABLE Student; ``` ### 方法二:临时禁用约束 可以临时禁用约束,删除 `Student` 表后再启用约束。不过这种方法需要谨慎使用,因为在禁用约束期间,可能会插入不符合约束的数据。 ```sql -- 禁用约束 SET FOREIGN_KEY_CHECKS = 0; -- 删除 Student 表 DROP TABLE Student; -- 启用约束 SET FOREIGN_KEY_CHECKS = 1; ``` ### 方法三:修改约束 如果可能的话,可以修改子表的约束,将其设置为 `ON DELETE CASCADE` 或 `ON DELETE SET NULL`。这样在删除 `Student` 表中的记录时,会自动处理关联的子表记录。 ```sql -- 修改约束为 ON DELETE CASCADE ALTER TABLE ChildTable DROP FOREIGN KEY fk_constraint_name; ALTER TABLE ChildTable ADD CONSTRAINT fk_constraint_name FOREIGN KEY (student_id) REFERENCES Student(id) ON DELETE CASCADE; -- 现在可以安全地删除 Student 表 DROP TABLE Student; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值