MySQL:当FK启用删除级联时,截断`myTable`时出错

时间:2011-10-06 15:09:52

标签: mysql sql database database-design

我有一个mysql ERM的问题,目前让我发疯。我有一个名为usuaris_backoffice的表用于存储后台用户,然后我还有一个名为usuaris_backoffice_permisos的表用于存储每个用户的权限。我还有一个名为perfils的表格,其中我存储了一些可以由backoffice users编辑的配置文件,因此要有一个版本历史记录,其中有一个名为perfils_usuari_backoffice的表格,其中我存储profile已由每个user修改。}然后我还有一个名为widgets的表格,也可以由用户编辑,因此小部件版本历史记录存储在widgets_usuari_backoffice中。 FK已启用级联删除,因此当从usuaris_backoffice删除用户时,其权限也会从usuaris_backoffice_permisos中删除。当我尝试:

时出现问题
 truncate usuaris_backoffice_permisos

这给了我以下错误:

 1701 - Cannot truncate a table referenced in a foreign key constraint (`test`.`usuaris_backoffice_permisos`, CONSTRAINT `FK_F8F850F3D001730C` FOREIGN KEY (`usuari_backoffice_id`) REFERENCES `test`.`usuaris_backoffice` (`id`)) 

由于这6个表是最大的ERM的一部分,我创建了一个小的测试环境,以便能够运行一些测试,因此以下代码可用于createpopulate tables

CREATE TABLE perfils_usuari_backoffice (perfil_id INT NOT NULL, login VARCHAR(20) NOT NULL, updated_at DATETIME NOT NULL, INDEX IDX_870785D657291544 (perfil_id), INDEX IDX_870785D6AA08CB10 (login), PRIMARY KEY(perfil_id, login, updated_at)) ENGINE = InnoDB;
CREATE TABLE usuaris_backoffice (id INT AUTO_INCREMENT NOT NULL, login VARCHAR(20) NOT NULL, password VARCHAR(32) NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, UNIQUE INDEX UNIQ_95E4B6E5AA08CB10 (login), PRIMARY KEY(id)) ENGINE = InnoDB;
CREATE TABLE usuaris_backoffice_permisos (id INT AUTO_INCREMENT NOT NULL, usuari_backoffice_id INT NOT NULL, es_admin TINYINT(1) NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, INDEX IDX_F8F850F3D001730C (usuari_backoffice_id), PRIMARY KEY(id)) ENGINE = InnoDB;
CREATE TABLE widgets_usuari_backoffice (widget_id INT NOT NULL, usuari_backoffice_id INT NOT NULL, updated_at DATETIME NOT NULL, INDEX IDX_43DA3B33FBE885E2 (widget_id), INDEX IDX_43DA3B33D001730C (usuari_backoffice_id), PRIMARY KEY(widget_id, usuari_backoffice_id, updated_at)) ENGINE = InnoDB;
CREATE TABLE widgets (id INT AUTO_INCREMENT NOT NULL, classe VARCHAR(20) NOT NULL, updated_at DATETIME NOT NULL, UNIQUE INDEX UNIQ_9D58E4C18F87BF96 (classe), PRIMARY KEY(id)) ENGINE = InnoDB;
CREATE TABLE perfils (id INT AUTO_INCREMENT NOT NULL, actiu TINYINT(1) NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB;

ALTER TABLE perfils_usuari_backoffice ADD CONSTRAINT FK_870785D657291544 FOREIGN KEY (perfil_id) REFERENCES perfils (id) ON DELETE CASCADE;
ALTER TABLE usuaris_backoffice_permisos ADD CONSTRAINT FK_F8F850F3D001730C FOREIGN KEY (usuari_backoffice_id) REFERENCES usuaris_backoffice (id) ON DELETE CASCADE;
ALTER TABLE perfils_usuari_backoffice ADD CONSTRAINT FK_870785D6AA08CB10 FOREIGN KEY (login) REFERENCES usuaris_backoffice (login) ON DELETE CASCADE;
ALTER TABLE widgets_usuari_backoffice ADD CONSTRAINT FK_43DA3B33D001730C FOREIGN KEY (usuari_backoffice_id) REFERENCES usuaris_backoffice (id) ON DELETE CASCADE;
ALTER TABLE widgets_usuari_backoffice ADD CONSTRAINT FK_43DA3B33FBE885E2 FOREIGN KEY (widget_id) REFERENCES widgets (id) ON DELETE CASCADE;

INSERT INTO `test`.`usuaris_backoffice` (`id` ,`login` ,`password` ,`created_at` ,`updated_at`)VALUES (NULL , 'edgar', '1234', '2011-10-06 00:00:00', '2011-10-06 00:00:00');
INSERT INTO `test`.`usuaris_backoffice_permisos` (`id`, `usuari_backoffice_id`, `es_admin`, `created_at`, `updated_at`) VALUES (NULL, '1', '0', '2011-10-06 00:00:00', '2011-10-06 00:00:00');
INSERT INTO `test`.`perfils` (`id`, `actiu`, `created_at`, `updated_at`) VALUES (NULL, '0', '2011-10-06 00:00:00', '2011-10-06 00:00:00');
INSERT INTO `test`.`perfils_usuari_backoffice` (`perfil_id`, `login`, `updated_at`) VALUES ('1', 'edgar', '2011-10-06 00:00:00');
INSERT INTO `test`.`widgets` (`id`, `classe`, `updated_at`) VALUES (NULL, 'hola', '2011-10-06 00:00:00');
INSERT INTO `test`.`widgets_usuari_backoffice` (`widget_id`, `usuari_backoffice_id`, `updated_at`) VALUES ('1', '1', '2011-10-06 00:00:00');

返回错误的代码是:

TRUNCATE usuaris_backoffice_permisos;
TRUNCATE perfils_usuari_backoffice;
TRUNCATE widgets_usuari_backoffice;
TRUNCATE usuaris_backoffice;

非常感谢您的时间,希望有人可以提供帮助:)

2 个答案:

答案 0 :(得分:2)

SET FOREIGN_KEY_CHECKS = 0;

然后截断你的表格。

答案 1 :(得分:2)

看看http://dev.mysql.com/doc/refman/5.5/en/truncate-table.html。它说

  如果来自引用该表的其他表的任何FOREIGN KEY约束,则对于InnoDB表,TRUNCATE TABLE失败。允许同一表的列之间的外键约束。

来自here它看起来在之前的某些版本中有效