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