2011-11-18 108 views
3

我需要從我的MySQL數據庫中刪除不推薦使用的空表。無法刪除MySQL表

表定義爲諾迪:

CREATE TABLE IF NOT EXISTS `Address` (
    `Id` int(11) NOT NULL AUTO_INCREMENT, 
    `ContactId` int(11) NOT NULL, 
    PRIMARY KEY (`Id`), 
    KEY `ContactId` (`ContactId`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

這導致

#1217 - Cannot delete or update a parent row: a foreign key constraint fails

有上的ContactID約束,但II've刪除它。

PHPMyAdmin的導出功能不會顯示超出上述表格定義的內容。表中沒有行,據我所知,沒有FKs引用Address.Id字段(但我不知道如何驗證這一點)。

有人可以請告訴我如何擺脫表?

+0

你有另一個表引用外鍵來解決? – Kokers

+0

@Kokers根據這個問題,不是我所知道的。 – Basic

回答

8

要列出外鍵

select 
    concat(table_name, '.', column_name) as 'foreign key', 
    concat(referenced_table_name, '.', referenced_column_name) as 'references' 
from 
    information_schema.key_column_usage 
where 
    referenced_table_name is not null; 

針對你的情況specifc搜索:

select 
    constraint_name 
from 
    information_schema.key_column_usage 
where 
    referenced_table_name = 'Address' AND referenced_column_name = 'ContactId'; 

要刪除一個外鍵約束:

ALTER TABLE [table_name] DROP FOREIGN KEY [constraint_name]; 
+0

這顯示了「Address.ContactId - Contact.Id」的條目,這使我認爲FK依然存在。我該如何核武它? – Basic

+0

你的聯繫表是否顯示FK關係來解決?我得到的是關鍵,源表和子表有兩方面,也許由於某種原因,當你擺脫原來的時候,其中一個沒有被刪除.. – xQbert

+0

然後我猜測它的確如此仍然存在。稍微修改了我的答案。 –

12
SET FOREIGN_KEY_CHECKS = 0; 
DROP TABLE Address; 
SET FOREIGN_KEY_CHECKS = 1; 
+0

儘管這有效,但它的風險很大,因爲系統仍然認爲它是FK關係;更好地解決這個問題,只有在你知道沒有表格有FK的情況下才使用它。 – xQbert

+0

謝謝......我敢肯定這會起作用,但我對忽略約束條件持謹慎態度,因爲它可能會破壞參照完整性(至少據我瞭解)。因此,我寧願在嘗試大錘之前解決根本問題。 – Basic

+0

@xQBert Snap lol – Basic