2012-02-28 4 views
1

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

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

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

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

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 и запускаю их вручную.

1

Я не 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 Website

Смежные вопросы