mysql - 如何删除表的所有外键
问题描述
我是编写程序的新手,我检查了一些 stackoverflow 帖子,但没有找到删除特定表的所有外键的帖子。
我有一个写在下面的程序。
drop procedure if exists remove_foreign_key;
delimiter ;;
create procedure remove_foreign_key(vTableName varchar(128)) begin
if exists (select table_name from information_schema.columns where table_schema=database() and table_name = vTableName) then
(SELECT concat('ALTER TABLE ', TABLE_NAME, ' DROP FOREIGN KEY ', CONSTRAINT_NAME, ';')
FROM information_schema.key_column_usage
WHERE table_schema=database() and TABLE_NAME = vTableName
AND referenced_table_name IS NOT NULL);
end if;
end if;
end;;
delimiter ;
call remove_foreign_key('my_table_name');
上面的查询返回我所有需要执行的查询(表包含的外键数),但我想一个一个地执行它们。我已经阅读了游标,但不确定它的实现。有人可以帮忙吗?
解决方案
下面是删除某些特定表的外键的 mysql 过程,希望对您有所帮助。您必须在 call 和 booom 中传递您的表名,这些表的外键将被删除。
DROP PROCEDURE IF EXISTS remove_foreign_key;
DELIMITER ;;
CREATE PROCEDURE remove_foreign_key(vTableName varchar(128))
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE cName VARCHAR(64);
DECLARE cur CURSOR FOR
SELECT DISTINCT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.Key_COLUMN_USAGE
WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME = vTableName
AND REFERENCED_TABLE_NAME IS NOT NULL;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
SET AUTOCOMMIT=0;
SET FOREIGN_KEY_CHECKS=0;
OPEN cur;
read_loop: LOOP
FETCH cur INTO cName;
IF done THEN
LEAVE read_loop;
END IF;
SET @sql = CONCAT('ALTER TABLE ',vTableName,' DROP FOREIGN KEY ',cName,';');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP;
CLOSE cur;
SET FOREIGN_KEY_CHECKS=1;
COMMIT;
SET AUTOCOMMIT=1;
END ;;
DELIMITER ;
call remove_foreign_key('table_name1');
call remove_foreign_key('table_name2');
推荐阅读
- python - 如何找到量化 matmul/conv2D 操作的浮点输出范围
- python - 错误是:django 中没有名为 util 的模块
- typescript - '&' 和 '|' 有什么区别 在打字稿中
- android - 重叠视图中的 onClickListener()
- python - 找出正则表达式满足句子的位置
- javascript - 单击 textarea 时设置单选按钮选中
- android - 我有一个问题:RecyclerView 在滚动时显示错误的数据
- reactjs - 嗨,使用 facebook 或 google 登录凭据登录后,如何将用户电子邮件和用户名传递给其他组件
- php - 展平正则表达式数组
- c# - 当 Bitmap 被缩放时,它是这样的