Имам решение, подобно на отговора на Bing, но отнема още една стъпка, за да бъде автоматично и повторно използваемо в процедура.
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///
delimiter ;
Тъй като подготвеният оператор може да обработва само един израз в даден момент, процедурата преминава през външните ключове с помощта на курсор и изпълнява всяко изпускане едно по едно.
За да използвате процедурата в една от вашите таблици, просто използвайте следното, като замените table_schema и table_name с вашите стойности:
call dropForeignKeysFromTable('table_schema', 'table_name');