Удалить все внешние ключи в базе данных (MySql) - программирование
Подтвердить что ты не робот

Удалить все внешние ключи в базе данных (MySql)

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

Я не хочу, чтобы удалить все constratints вручную, есть ли способ удалить все ограничения внешнего ключа в базе данных?

Я также пробовал SET FOREIGN_KEY_CHECKS=0;, но я все еще не могу переименовать столбец.

4b9b3361

Ответ 1

Выполнение следующего запроса

select * from information_schema.key_column_usage

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

CONSTRAINT_CATALOG
CONSTRAINT_SCHEMA
CONSTRAINT_NAME
TABLE_CATALOG
TABLE_SCHEMA
TABLE_NAME
COLUMN_NAME
ORDINAL_POSITION
POSITION_IN_UNIQUE_CONSTRAINT
REFERENCED_TABLE_SCHEMA
REFERENCED_TABLE_NAME
REFERENCED_COLUMN_NAME

Затем, если вы планируете удалить каждое ограничение, которое вы ссылаетесь на свой столбец, вы должны рассмотреть столбцы REFERENCED _ * и запустить что-то вроде:

DELETE FROM information_schema.key_column_usage 
WHERE 
    REFERENCED_TABLE_SCHEMA='myschema'
    AND
    REFERENCED_TABLE_NAME='mytable'
    AND
    REFERENCED_COLUMN_NAME='mycolumn'

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

Ответ 2

Вы можете использовать этот SQL для генерации ALTER TABLES (!!YOUR_SCHEMA_HERE!! необходимо заменить вашей схемой):

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_schema='!!YOUR_SCHEMA_HERE!!';

Он будет генерировать SQL следующим образом:

alter table viewpoint_test.answer_code DROP FOREIGN KEY fk_answer_code_codebook_item1;
alter table viewpoint_test.answer_code DROP FOREIGN KEY fk_answer_code_questionary_answer1;
alter table viewpoint_test.codebook DROP FOREIGN KEY codebook_ibfk_1;
...

Ответ 3

Вы можете попробовать использовать как подходящий..

ALTER TABLE tableName
DROP FOREIGN KEY fieldName;
ADD FOREIGN KEY (newForignKeyFieldName);

Также вы можете попробовать с ссылкой Key.As как.....

ALTER TABLE tableName
DROP FOREIGN KEY fieldName;
ADD FOREIGN KEY (newForignKeyFieldName)
REFERENCES anotherTableName(reference_id);

Ответ 4

В следующем запросе будет создан правильный синтаксис автоматически. Убедитесь, что вы указали свое реальное имя схемы БД в состоянии WHERE. Просто выполните каждую строку, и все ваши FOREIGN KEYS исчезнут.

Я оставляю обратное (добавление их обратно) в качестве упражнения для вас.

SELECT CONCAT("alter table ", TABLE_NAME," drop foreign key ", CONSTRAINT_NAME,"; ") AS runMe
FROM information_schema.key_column_usage 
WHERE TABLE_SCHEMA='MY_SCHEMA_NAME' AND CONSTRAINT_NAME <> 'PRIMARY';

Если вам нужно, чтобы она была независимой от схемы, вы можете написать: TABLE_SCHEMA=DATABASE(), чтобы получить текущее имя активной БД