2011-09-04 50 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

相关问题