如何测试与外键链接的表


How to test tables linked with foreign keys?

我正在使用红豆ORM与mysql和编码器工作。在为多对多关联实现外键之后,我在运行时得到以下错误:

drop TABLE IF EXISTS `temp`
Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key constraint fails thrown

然后在phpmyadmin中输入SHOW ENGINE INNODB STATUS。输出包括:

LATEST FOREIGN KEY ERROR------------------------:  Cannot drop table `db1`.`temp`because it is referenced by `db1`.`temp_workers`.

换句话说,另一个表引用FK。出于测试目的,我认为最好的方法是删除所有相关的表,并使用我正在测试的控制器重新创建它们。这是最好的办法吗?我试过:

drop TABLE IF EXISTS `temp` `temp_workers`

,但我仍然得到上述错误,并且删除命令不起作用。还:

truncate TABLE `temp`, `temp_workers`

给:

You have an error in your SQL syntax

正如评论中提到的,您必须首先将具有FK约束的任何表删除到其他表,然后才能删除正在链接的表。

的例子:

User
  id: 1
  name: Mike
Address 
  id: 1
  user_id: 1 (FK constraint to User.id table.column)
  address_1: 555 Main Street

这个设置是1:1的关系(更多关于数据规范化),其中一个用户行可以引用一个地址行,并且由于地址行依赖于用户行的存在,如果尝试删除用户行,您将看到前面提到的错误。

但是如果你先删除地址表,一切都像预期的那样工作,因为User表不是FK到任何其他表。

确保模式中的引用完整性可以确保不会出现孤立行,这将渗透到整个数据驱动的应用程序中。

您还可以发出以下命令:

SET foreign_key_checks = 0;
# Do Stuff
SET foreign_key_checks = 1;

但是我强烈建议不要这样做,因为你可能会破坏数据的引用完整性,最终导致真正的混乱。我曾见过有人在企业环境中这样做,他们花了几周时间才清理干净。但是,如果您严格执行以进行测试;比如编写单元测试,或者只是学习,并且您不想每次都删除表,您可以这样做:

# Because we remove the foreign key check, we can truncate in any order
SET foreign_key_checks = 0;
TRUNCATE TABLE user;
TRUNCATE TABLE address;
SET foreign_key_checks = 1;

使用外键约束的正确模式设计可以为任何数据驱动的应用程序构建良好的基础。了解何时使用以及如何构造外键约束需要时间,但随着时间的推移,您将开始理解。开始的一个好方法是下载一个开源项目,如magento、wordpress或vbulletin,并查看它们的模式。您甚至可以使用MySQL工作台内省这些模式,并查看它们的实体关系图(ERDs),它将直观地演示表之间的链接。