如何测试与外键链接的表?

use*_*629 5 php mysql

我使用redbean ORM使用mysql和codeigniter.在为多对多的assosciation实现外键后,我运行时出现以下错误:

drop TABLE IF EXISTS `temp`

Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key constraint fails thrown
Run Code Online (Sandbox Code Playgroud)

然后我进入了phpmyadmin进入SHOW ENGINE INNODB状态.输出包括:

LATEST FOREIGN KEY ERROR------------------------:  Cannot drop table `db1`.`temp`because it is referenced by `db1`.`temp_workers`.
Run Code Online (Sandbox Code Playgroud)

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

drop TABLE IF EXISTS `temp` `temp_workers`
Run Code Online (Sandbox Code Playgroud)

,但我仍然得到上述错误,并且drop命令不起作用.也:

truncate TABLE `temp`, `temp_workers`
Run Code Online (Sandbox Code Playgroud)

得到:

You have an error in your SQL syntax
Run Code Online (Sandbox Code Playgroud)

Mik*_*ell 3

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

例子:

User
  id: 1
  name: Mike

Address 
  id: 1
  user_id: 1 (FK constraint to User.id table.column)
  address_1: 555 Main Street
Run Code Online (Sandbox Code Playgroud)

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

但是,如果您先删除“地址”表,则一切都会按预期进行,因为“用户”表与任何其他表都不是 FK。

确保架构内的引用完整性可确保您不会最终出现孤立行,这些行将渗透到整个数据驱动的应用程序中。

您还可以发出以下命令:

SET foreign_key_checks = 0;
# Do Stuff
SET foreign_key_checks = 1;
Run Code Online (Sandbox Code Playgroud)

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

# 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;
Run Code Online (Sandbox Code Playgroud)

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