मेरे पास बिंग के उत्तर के समान एक समाधान है, लेकिन यह एक प्रक्रिया में स्वचालित और पुन:प्रयोज्य होने के लिए एक कदम आगे ले जाता है।
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');