2012-02-28 45 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語句不知道如何將選擇的結果外推到拖放外鍵的多次執行中。

我平時做這樣的事情:

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語句上面的查詢。然後,我將這些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