DROP все внешние ключи в базе данных MYSQL
Внешние ключи вызывают у меня слишком много проблем, изменяющих структуру базы данных для удовлетворения новых требований - я хочу изменить первичные ключи, но, похоже, я не могу, когда внешние ключи ссылаются на эту таблицу (я думаю, потому что MySQL отбрасывает таблицу и воссоздает).
Поэтому, когда я работаю над БД, я бы хотел просто удалить все внешние ключи и повторно создать их позже. Есть ли способ сделать это?
Ответы
Ответ 1
Вы можете просто выполнить следующую команду перед любыми операторами Alter Table, которые вы собираетесь сделать:
SET foreign_key_checks = 0;
Это отключит проверки ограничений внешнего ключа для подключения к базе данных. Затем вы можете внести свои изменения, не беспокоясь о ограничениях.
После того, как вы закончите, не забудьте выпустить:
SET foreign_key_checks = 1;
Чтобы включить их.
Обратите внимание, что это все равно не позволит вам создать новое ограничение внешнего ключа, которое завершится неудачно, потому что типы данных столбца не совпадают.
Ответ 2
Run
SELECT concat('ALTER TABLE ', TABLE_NAME, ' DROP FOREIGN KEY ', CONSTRAINT_NAME, ';')
FROM information_schema.key_column_usage
WHERE CONSTRAINT_SCHEMA = 'db_name'
AND referenced_table_name IS NOT NULL;
и запустите вывод.
Ответ 3
Другая версия кода Zoozy, здесь вы можете выбрать только таблицу:
SELECT concat('ALTER TABLE ', TABLE_NAME, ' DROP FOREIGN KEY ', CONSTRAINT_NAME, ';')
FROM information_schema.key_column_usage
WHERE CONSTRAINT_SCHEMA = 'YOUR DB HERE'
AND TABLE_NAME='YOUR TABLE HERE'
AND REFERENCED_TABLE_NAME IS NOT NULL;
Также с помощью процедуры:
DROP PROCEDURE IF EXISTS dropForeignKeysFromTable;
delimiter ///
create procedure dropForeignKeysFromTable(IN param_table_schema varchar(255), IN param_table_name varchar(255))
begin
declare done int default FALSE;
declare dropCommand varchar(255);
declare dropCur cursor for
select concat('alter table ',table_schema,'.',table_name,' DROP FOREIGN KEY ',constraint_name, ';')
from information_schema.table_constraints
where constraint_type='FOREIGN KEY'
and table_name = param_table_name
and table_schema = param_table_schema;
declare continue handler for not found set done = true;
open dropCur;
read_loop: loop
fetch dropCur into dropCommand;
if done then
leave read_loop;
end if;
set @sdropCommand = dropCommand;
prepare dropClientUpdateKeyStmt from @sdropCommand;
execute dropClientUpdateKeyStmt;
deallocate prepare dropClientUpdateKeyStmt;
end loop;
close dropCur;
end///