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;
請注意,所有的約束都被設置爲DELETE
和UPDATE 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,它的工作原理!
有沒有人知道爲什麼會發生這種情況?
錯誤的問題是我們已經設置爲DELETE ON CASCADE。我相信預期的行爲是我們在Server 5.1上獲得的行爲,它將TRUNCATES指定的表並刪除其他FK設置表上的所有數據。 當然,這幾乎就像數據庫的「完整截斷」,但我確實指定了DELETE ON CASCADE,這就是它應該做的事情,不是嗎? –
我們已經對該項目進行了測試,實際上並沒有「簡單」的出路。如果我們按照指定的解決方案並禁用ForeignKeys通知,每當在用戶表上刪除一行時,tblpost上就沒有任何反應,這是錯誤的。 我們已決定將所有MySQL服務器保持在同一版本上,以避免出現類似這樣的更多問題。 感謝a1ex07的幫助! –
我相信他們應該在文檔的某個地方說出類似於「你不能截斷FK引用的表」的內容來清除所有的誤解。在我看來,他們寧願在以前的版本中有一個錯誤,這使得在涉及到FK時'TRUNCATE'與'DELETE'類似,沒有'WHERE'。我意識到這是頗有爭議的觀點,但我的想法是'TRUNCATE'應該比'DELETE'包含更少的開銷,並且不必關心FK約束。 – a1ex07