mysql删除数据库所有外键

本文介绍如何在MySQL中禁用外键检查,提供SQL语句用于删除数据库中的所有外键约束,包括通过修改系统变量FOREIGN_KEY_CHECKS来临时禁用外键约束的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

删除所有表的外键
 查询schema中所有外键名称然后拼接生成删除语句,再执行。

SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' DROP FOREIGN KEY ',CONSTRAINT_NAME,' ;') 
FROM information_schema.TABLE_CONSTRAINTS c 
WHERE c.TABLE_SCHEMA='库名' AND c.CONSTRAINT_TYPE='FOREIGN KEY';

修改MySQL变量FOREIGN_KEY_CHECKS
-- 禁用外键约束
SET FOREIGN_KEY_CHECKS = 0
-- 启用外键约束
SET FOREIGN_KEY_CHECKS = 1;

由于FOREIGN_KEY_CHECKS是基于session的,当关闭了session重新建立连接,这个变量就会恢复默认值,也就是开启外键约束,当然我们也可以全局的FOREIGN_KEY_CHECKS变量。

SET GLOBAL FOREIGN_KEY_CHECKS = 0;
1
或者:

SET @@GLOBAL.FOREIGN_KEY_CHECKS = 0;
1
修改完成后,我们可以查看修改后的结果

SELECT @@FOREIGN_KEY_CHECKS;
--------------------- 
作者:李阿飞 
来源:优快云 
原文:https://blog.youkuaiyun.com/junlovejava/article/details/78360253 
版权声明:本文为博主原创文章,转载请附上博文链接!

### MySQL 约束的使用方法及示例 #### 什么是约束? 约束是一种用于维护数据库中表之间关系的机制。它通过定义两个表之间的关联来确保数据的一致性和完整性。在约束的作用下,子表中的某些字段必须匹配父表中的对应字段值,或者可以为空。 #### 创建表时设置约束 在创建表的过程中可以直接指定约束。以下是具体的语法: ```sql CREATE TABLE 子表名 ( 字段1 数据类型, 字段2 数据类型, ... CONSTRAINT 约束名称 FOREIGN KEY (子表字段) REFERENCES 父表名(父表字段) ); ``` 例如,在 `tb_employee` 表中添加对 `deptId` 的约束,指向 `tb_dept` 表的主 `id`[^3]: ```sql CREATE TABLE tb_employee ( id INT PRIMARY KEY, name VARCHAR(50), deptId INT, CONSTRAINT fk_emp_dept FOREIGN KEY (deptId) REFERENCES tb_dept(id) ); ``` #### 修改表时添加约束 如果需要在已存在的表上添加约束,可以通过 `ALTER TABLE` 命令实现: ```sql ALTER TABLE 子表名 ADD CONSTRAINT 约束名称 FOREIGN KEY (子表字段) REFERENCES 父表名(父表字段); ``` 例如,向已有表 `tb_employee` 添加约束[^2]: ```sql ALTER TABLE tb_employee ADD CONSTRAINT fk_emp_dept FOREIGN KEY (deptId) REFERENCES tb_dept(id); ``` #### 删除约束 当不再需要某个约束时,可以将其删除。具体命令如下: ```sql ALTER TABLE 子表名 DROP FOREIGN KEY 约束名称; ``` 例如,移除名为 `fk_emp_dept` 的约束: ```sql ALTER TABLE tb_employee DROP FOREIGN KEY fk_emp_dept; ``` #### 查看约束 要查看当前数据库中存在的约束及其相关信息,可以查询系统表或执行以下语句: ```sql SELECT TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = '数据库名' AND REFERENCED_TABLE_NAME IS NOT NULL; ``` 这将返回所有与目标数据库相关的信息[^1]。 #### 约束下的数据删除行为 默认情况下,如果尝试删除父表中被子表引用的数据记录,则会抛出错误提示违反约束条件。为了改变这种行为,可以在定义时加入级联选项(CASCADE 或 SET NULL)。例如: - **ON DELETE CASCADE**:当父表中的记录被删除时,自动删除子表中对应的记录。 - **ON UPDATE CASCADE**:当父表中的主更新时,同步更新子表中的值。 示例代码如下: ```sql CREATE TABLE tb_employee ( id INT PRIMARY KEY, name VARCHAR(50), deptId INT, CONSTRAINT fk_emp_dept FOREIGN KEY (deptId) REFERENCES tb_dept(id) ON DELETE CASCADE ); ``` 上述配置表示,一旦部门表 (`tb_dept`) 中某条记录被删除,员工表 (`tb_employee`) 中与此部门相关联的所有记录也会随之删除。 --- ### 总结 MySQL 约束提供了强大的功能以保障跨表间的关系一致性。无论是创建新表还是调整现有结构,都可以灵活运用这些技术手段满足实际需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值