Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Ist es möglich, alle Fremdschlüsseleinschränkungen für eine Tabelle in mySQL 5 auf einmal zu löschen?

Ich habe eine Lösung ähnlich der Antwort von Bing, aber es geht noch einen Schritt weiter, um automatisch und in einem Verfahren wiederverwendbar zu sein.

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 ;

Da eine vorbereitete Anweisung jeweils nur eine Anweisung verarbeiten kann, durchläuft die Prozedur die Fremdschlüssel mithilfe eines Cursors und führt jeden Tropfen einzeln aus.

Um die Prozedur auf eine Ihrer Tabellen anzuwenden, verwenden Sie einfach Folgendes, wobei Sie table_schema und table_name durch Ihre Werte ersetzen:

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