Подтвердить что ты не робот

DROP все внешние ключи в базе данных MYSQL

Внешние ключи вызывают у меня слишком много проблем, изменяющих структуру базы данных для удовлетворения новых требований - я хочу изменить первичные ключи, но, похоже, я не могу, когда внешние ключи ссылаются на эту таблицу (я думаю, потому что MySQL отбрасывает таблицу и воссоздает).

Поэтому, когда я работаю над БД, я бы хотел просто удалить все внешние ключи и повторно создать их позже. Есть ли способ сделать это?

4b9b3361

Ответ 1

Вы можете просто выполнить следующую команду перед любыми операторами Alter Table, которые вы собираетесь сделать:

SET foreign_key_checks = 0;

Это отключит проверки ограничений внешнего ключа для подключения к базе данных. Затем вы можете внести свои изменения, не беспокоясь о ограничениях.

После того, как вы закончите, не забудьте выпустить:

SET foreign_key_checks = 1;

Чтобы включить их.

Обратите внимание, что это все равно не позволит вам создать новое ограничение внешнего ключа, которое завершится неудачно, потому что типы данных столбца не совпадают.

Ответ 2

Run

SELECT concat('ALTER TABLE ', TABLE_NAME, ' DROP FOREIGN KEY ', CONSTRAINT_NAME, ';') 
FROM information_schema.key_column_usage 
WHERE CONSTRAINT_SCHEMA = 'db_name' 
AND referenced_table_name IS NOT NULL;

и запустите вывод.

Ответ 3

Другая версия кода Zoozy, здесь вы можете выбрать только таблицу:

SELECT concat('ALTER TABLE ', TABLE_NAME, ' DROP FOREIGN KEY ', CONSTRAINT_NAME, ';') 
FROM information_schema.key_column_usage 
WHERE CONSTRAINT_SCHEMA = 'YOUR DB HERE' 
AND TABLE_NAME='YOUR TABLE HERE' 
AND REFERENCED_TABLE_NAME IS NOT NULL;

Также с помощью процедуры:

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///