sql >> Database >  >> RDS >> Mysql

Is het mogelijk om alle beperkingen voor externe sleutels in één keer in mySQL 5 op een tabel te plaatsen?

Ik heb een oplossing die lijkt op het antwoord van Bing, maar het gaat nog een stap verder om automatisch en herbruikbaar te zijn in een procedure.

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 ;

Aangezien een voorbereide instructie slechts één instructie tegelijk kan verwerken, doorloopt de procedure de externe sleutels met behulp van een cursor en voert elke drop één voor één uit.

Om de procedure op een van uw tabellen te gebruiken, gebruikt u gewoon het volgende, waarbij u table_schema en table_name vervangt door uw waarden:

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


  1. Verschil tussen VARCHAR en TEXT in MySQL

  2. PostgreSQL 12-prestaties bewaken met OmniDB - deel 2

  3. probleem met utf8 in java

  4. Geef PHP Array door via jQuery Ajax