2011-09-04 100 views
4

我在截斷MySQL Server 5.5上的表時遇到問題。嘗試截斷表時發生MySQL錯誤

我試圖截斷的表有一列充當另一個表中的外鍵。

涉及兩個表的CREATE TABLE是因爲它遵循:

CREATE TABLE `tbluser` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `email` varchar(255) NOT NULL, 
    `password` varchar(255) NOT NULL, 
    `name` varchar(255) NOT NULL, 
    `creationDate` datetime NOT NULL, 
    `creationUserId` int(11) NOT NULL, 
    `updateDate` datetime NOT NULL, 
    `updateUserId` int(11) NOT NULL, 
    `lastAccess` datetime NOT NULL, 
    `enabled` tinyint(1) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `id_UNIQUE` (`id`), 
    UNIQUE KEY `email_UNIQUE` (`email`), 
    KEY `FK_tbluser_creationUserId` (`creationUserId`), 
    KEY `FK_tbluser_updateUserId` (`updateUserId`), 
    CONSTRAINT `FK_tbluser_updateUserId` FOREIGN KEY (`updateUserId`) REFERENCES `tbluser` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, 
    CONSTRAINT `FK_tbluser_creationUserId` FOREIGN KEY (`creationUserId`) REFERENCES `tbluser` (`id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1; 

CREATE TABLE `tblpost` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `title` varchar(255) NOT NULL, 
    `content` mediumtext NOT NULL, 
    `creationDate` datetime NOT NULL DEFAULT '1901-01-01 00:00:00', 
    `creationUserId` int(11) NOT NULL, 
    `updateDate` datetime NOT NULL DEFAULT '1901-01-01 00:00:00', 
    `updateUserId` int(11) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `FK_tblpost_creationUserId` (`creationUserId`), 
    KEY `FK_tblpost_updateUserId` (`updateUserId`), 
    CONSTRAINT `FK_tblpost_updateUserId` FOREIGN KEY (`updateUserId`) REFERENCES `tbluser` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, 
    CONSTRAINT `FK_tblpost_creationUserId` FOREIGN KEY (`creationUserId`) REFERENCES `tbluser` (`id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

請注意,所有的約束都被設置爲DELETEUPDATE ON CASCADE

當我嘗試TRUNCATE表:

TRUNCATE TABLE `<databasename>`.`tbluser`; 

我收到以下錯誤信息:

Cannot truncate a table referenced in a foreign key constraint 
(`<databasename>`.`tblpost`, 
CONSTRAINT `FK_tblpost_updateUserId` 
FOREIGN KEY (`updateUserId`) 
REFERENCES `<databasename>`.`tbluser` (`id`)) 

除了這個信息,有一個事實,即當動作上面嘗試在MySQL服務器5.1,它的工作原理!

有沒有人知道爲什麼會發生這種情況?

回答

3

檢查here。這很有道理,TRUNCATE TABLE在這種情況下會產生錯誤;它沒有記錄的壞事。

+0

錯誤的問題是我們已經設置爲DELETE ON CASCADE。我相信預期的行爲是我們在Server 5.1上獲得的行爲,它將TRUNCATES指定的表並刪除其他FK設置表上的所有數據。 當然,這幾乎就像數據庫的「完整截斷」,但我確實指定了DELETE ON CASCADE,這就是它應該做的事情,不是嗎? –

+0

我們已經對該項目進行了測試,實際上並沒有「簡單」的出路。如果我們按照指定的解決方案並禁用ForeignKeys通知,每當在用戶表上刪除一行時,tblpost上就沒有任何反應,這是錯誤的。 我們已決定將所有MySQL服務器保持在同一版本上,以避免出現類似這樣的更多問題。 感謝a1ex07的幫助! –

+0

我相信他們應該在文檔的某個地方說出類似於「你不能截斷FK引用的表」的內容來清除所有的誤解。在我看來,他們寧願在以前的版本中有一個錯誤,這使得在涉及到FK時'TRUNCATE'與'DELETE'類似,沒有'WHERE'。我意識到這是頗有爭議的觀點,但我的想法是'TRUNCATE'應該比'DELETE'包含更少的開銷,並且不必關心FK約束。 – a1ex07

相關問題