Mysql
 sql >> Database >  >> RDS >> Mysql

È possibile eliminare tutti i vincoli di chiave esterna su una tabella contemporaneamente in MySQL 5?

Ho una soluzione simile alla risposta di Bing, ma ci vuole un ulteriore passo avanti per essere automatica e riutilizzabile in una procedura.

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 ;

Poiché un'istruzione preparata può gestire solo un'istruzione alla volta, la procedura scorre le chiavi esterne utilizzando un cursore ed esegue ciascuna eliminazione una alla volta.

Per utilizzare la procedura su una delle tue tabelle, usa quanto segue, sostituendo table_schema e table_name con i tuoi valori:

call dropForeignKeysFromTable('table_schema', 'table_name');