Удалить отношения внешних ключей из всех таблиц - PullRequest
7 голосов
/ 13 августа 2011

У меня есть база данных с несколькими таблицами. Во многих таблицах есть поля с ограничениями внешнего ключа. Я хочу обрезать таблицы и затем заполнить их новыми данными, а также хочу удалить внешние ключи, так как некоторые отношения изменились. по сути, я хочу снова создать ограничения FK с нуля. Как я могу удалить текущие ограничения FK из всех таблиц?

Ответы [ 3 ]

10 голосов
/ 13 августа 2011

Вы можете играть с информационным_схема. Взгляните на эту страницу

http://dev.mysql.com/doc/refman/5.0/en/key-column-usage-table.html

select concat('alter table ',table_name,' drop foreign key ',constraint_name,';') 
from information_schema.key_column_usage
where constraint_schema = 'your_db' and referenced_table_name = 'table_name';

затем запустите сгенерированный вывод.

Вы можете сделать что-то подобное, чтобы обрезать все таблицы.

select concat('truncate ',table_name,';') 
from information_schema.tables
where table_schema = 'your_db' and table_type = 'base table'

эта будет урезать все таблицы в указанной базе данных. Так что используйте его с осторожностью.

3 голосов
/ 02 февраля 2012

Полагаю, вы уже нашли решение, так как этому посту уже шесть месяцев, но недавно мне пришлось придумать сценарий для удаления ограничений внешнего ключа для конкретной таблицы в MySQL, чтобы это могло помочь любомута же самая лодка:

# create a handy dandy stored procedure
DELIMITER $$
CREATE PROCEDURE DropConstraints(refschema VARCHAR(64), reftable VARCHAR(64), refcolumn VARCHAR(64))
BEGIN
    WHILE EXISTS(
        SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
        WHERE 1
        AND REFERENCED_TABLE_SCHEMA = refschema
        AND REFERENCED_TABLE_NAME = reftable
        AND REFERENCED_COLUMN_NAME = refcolumn
    ) DO
        BEGIN
            SET @sqlstmt = (
                SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' DROP FOREIGN KEY ',CONSTRAINT_NAME)
                FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
                WHERE 1
                AND REFERENCED_TABLE_SCHEMA = refschema
                AND REFERENCED_TABLE_NAME = reftable
                AND REFERENCED_COLUMN_NAME = refcolumn
                LIMIT 1
            );
            PREPARE stmt1 FROM @sqlstmt;
            EXECUTE stmt1;
        END;
    END WHILE;
END$$
DELIMITER ;

Чтобы запустить ее, просто используйте:

SET @schema = 'schema_name';
CALL DropConstraints(@schema, 'TableName', 'Referenced_Column_1');
CALL DropConstraints(@schema, 'TableName', 'Referenced_Column_2');

А если вы не хотите продолжать процедуру:* Конечно, если вы хотите удалить все ограничения FK в таблицу, вы можете удалить параметр refcolumn и последнюю строку каждого предложения where.

0 голосов
/ 13 августа 2011
 ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...