2013-10-11 155 views
2

尝试删除所有数据并将AUTOMATIC_INCREMENT重置为0,以便我有一个干净的数据库可以使用。发现了一个截断功能应该允许我做以上但它抛出回这个错误.... 不能截断外键约束MySQL截断错误

(`film`.`reviewed`, CONSTRAINT `reviewed_ibfk_1` FOREIGN KEY (`movie_id`) REFERENCES `film`.`films` (`movie_id`)) 

引用的表难道这意味着我不得不删除外国关键?

回答

2

是的,你不能截断有外键约束的表,它

由于每docs: -

TRUNCATE TABLE为一个InnoDB表失败,如果有任何外国KEY 来自引用表的其他表的约束。外部密钥 允许在同一个表的列之间进行约束。

虽然你有替代这样做: -

SET FOREIGN_KEY_CHECKS=0; 
TRUNCATE table1; 
SET FOREIGN_KEY_CHECKS=1; 
+0

我不推荐这种方法,因为您可能会遗留一些悬挂引用。如果你尊重你的FK限制,并以正确的顺序截断表格,你会更好。看到我对这个问题的回答。 –

+0

@DMac: - 这是正确的,但我刚刚提供了一个替代方案。我确实提到过“**你不能截断有外键约束的表**” –

0

可以截断与外键约束的表;我一直这样做。但是你必须以正确的顺序来满足约束条件。

如果您有两个表,TABLEB具有引用TABLEA的FK约束,那么您必须首先对TABLE进行TRUNCATE TABLEB操作,然后再对TABLEA进行操作。

需要明确的是,如果TABLEB包括约束

CONSTRAINT `xid_fk` FOREIGN KEY (`xid_fk`) REFERENCES `TABLEA` (`id`) 

,那么你不能首先截断TABLEA,因为这会造成在TABLEB悬挂引用。但是,如果首先截断TABLEB,则可以无误地截断TABLEA。