Как динамически удалить внешний ключ из таблицы MySQL? - PullRequest
1 голос
/ 28 февраля 2012

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

alter table tblTableWhereFKIs drop foreign key (select constraint_name 
from information_schema.key_column_usage 
where referenced_table_name = 'tblReferencedByFK' and table_name = 'tblTableWhereFKIs' limit 1);

Но я получаю ошибку:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(select constraint_name
from information_schema.key_column_usage
where referen' at line 1

Работает только один:

mysql> select constraint_name
    -> from information_schema.key_column_usage
    -> where referenced_table_name = 'tblReferencedByFK' and table_name = 'tblTableWhereFKIs' limit 1;
+-----------------------------------------+
| constraint_name                         |
+-----------------------------------------+
| fk_tblTableWhereFKIs_tblReferencedByFK1 |
+-----------------------------------------+
1 row in set (0.08 sec)

Ответы [ 2 ]

2 голосов
/ 28 февраля 2012

У меня нет mySQL, поэтому я не могу это проверить, но я думаю, что что-то вроде следующего будет работать:

DECLARE @SQL VARCHAR(100)

SELECT  @SQL = 'alter table tblTableWhereFKIs drop foreign key ' + constraint_name
FROM    information_schema.key_column_usage
WHERE   referenced_table_name = 'tblReferencedByFK' 
AND     table_name = 'tblTableWhereFKIs'

PREPARE stmt FROM @SQL
EXECUTE stmt

Мой опыт работы с MySQL ограничен, так что это смесь вашего ответа и информации с сайта MySQL

2 голосов
/ 28 февраля 2012

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

Я обычно делаю что-то вроде этого:

SELECT CONCAT('alter table ', table_name, ' drop foreign key ', constraint_name, ';')
FROM information_schema.key_column_usage
WHERE referenced_table_name = 'tblReferencedByFK' and table_name = 'tblTableWhereFKIs';

Я выполняю вышеуказанный запроскоторый будет строить все заявления об изменении для меня.Затем я беру этот список операторов alter и запускаю их вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...