как удалить все внешние ключи для таблицы - PullRequest
0 голосов
/ 19 сентября 2018

Я новичок в написании процедур, я проверил некоторые сообщения 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');

вышеуказанный запрос возвращает мне все запросы (количество внешних ключей, содержащихся в таблице), которые необходимо выполнить, но я хочу выполнить их один за другим. Я читал о курсоре, но не уверен насчет его реализации.кто-нибудь поможет?

1 Ответ

0 голосов
/ 21 сентября 2018

ниже - процедура mysql для удаления внешних ключей некоторых конкретных таблиц, надеюсь, это поможет. Вам нужно передать имя таблицы в вызове и буме, ваши внешние ключи будут удалены для этих таблиц.

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