Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何删除表的所有外键_Mysql_Sql_Cursor_Procedure - Fatal编程技术网

Mysql 如何删除表的所有外键

Mysql 如何删除表的所有外键,mysql,sql,cursor,procedure,Mysql,Sql,Cursor,Procedure,我不熟悉编写程序,我检查了一些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

我不熟悉编写程序,我检查了一些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和BOOM中传递表名,这些表的外键将被删除

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');

所以对于每个外键,你想一个接一个地启动这个过程吗?不,对于每个表好的,所以在表上使用一个光标,它将获取表,然后启动这个过程。这是每个表的循环过程,所以?请检查链接,我希望它有助于解决您的问题。