Php 我应该如何在mysql数据库中使用外键导入单独的表?

Php 我应该如何在mysql数据库中使用外键导入单独的表?,php,mysql,database,Php,Mysql,Database,我使用Mysql和PHP,我的数据库有约束。我已经通过以下步骤为整个数据库导入了一个sql文件: 开始交易。 使用fopen读取文件。 匹配并删除文件中的所有注释,同时使用分隔符收集整个查询;到一个数组。 将检查外键设置为0 删除或截断所有表。 逐个运行数组的查询元素。 将check外键设置为1 提交事务 若其他任何事情是fail-try-catch,则回滚事务将被触发。 一切正常。但是,现在我必须扩展它。我要做一个导入系统,可以为网站的个人功能导入。这意味着我必须使一个系统能够导入单个表并保持

我使用Mysql和PHP,我的数据库有约束。我已经通过以下步骤为整个数据库导入了一个sql文件:

开始交易。 使用fopen读取文件。 匹配并删除文件中的所有注释,同时使用分隔符收集整个查询;到一个数组。 将检查外键设置为0 删除或截断所有表。 逐个运行数组的查询元素。 将check外键设置为1 提交事务 若其他任何事情是fail-try-catch,则回滚事务将被触发。 一切正常。但是,现在我必须扩展它。我要做一个导入系统,可以为网站的个人功能导入。这意味着我必须使一个系统能够导入单个表并保持它们的约束。例如,我的系统有用户表、文章。。。当从本地导入文章导出并导入到development server时,我必须检查用户id,以确保应用程序正在开发此用户。我以前从未做过这样的事。我看起来很复杂


因此,我想问大家怎么做?有多少种方法?哪一个是最好的解决方案?或者,如果您有很多经验,您能告诉我应该在哪里学习它,或者我应该读哪本书来改进数据库解决方案的实践吗

可以关闭外键约束:

-- switch off
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;

-- make import

-- switch on
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;

您可以将导入数据加载到临时表中,并在其中查找无效行

如果存在tmp_导入_项目,则删除临时表; 创建临时表tmp_import_article LIKE article; -TODO:将导入数据加载或插入tmp_导入文章 -选择无效行 选择tia* 从tmp_进口_文章tia 在u.user\u id=tia.user\u id上左连接'user`u 其中u.user_id为空; 如果得到的结果为空,则一切正常,可以将临时表中的数据插入到实际表中


如果您得到的结果不是空的,请在错误消息中向用户显示。

谢谢您的评论。然而,如果我这样做,我就不会保持数据的完整性。例如,如果我导入了一篇在我的应用程序开发环境中没有用户id的文章,会发生什么。该用户是在本地环境中创建的,我只想从我的本地导出文章并将其导入到app dev env。您可以使用真实数据库的实际副本设置beta stand,以便在生产服务器上运行迁移之前测试迁移。我必须为其他使用它的用户创建此功能,而不仅仅是为我。因此,我必须从另一个人那里发现破坏数据完整性的问题。如果文章的用户id不存在,该怎么办?忽略它?显示错误?还有别的吗?我没有这方面的经验。但我想我会向最终用户显示一条错误消息,并重新检查他们的导入文件。因此,如果任何文章违反外键约束,你根本不想导入任何数据?伙计,语言,语言…抱歉,我的英语不好!非常感谢你。您认为此解决方案与使用事务相同吗?您也可以将此解决方案用于事务。在选择无效行之前启动事务,如果未找到无效行,则在将数据从临时表插入到真实表之后提交。如果您找到任何ivalid行,您可以提交或回滚-在这种情况下这无关紧要,因为您不会更改任何数据。顺便说一句:不要按原样使用此解决方案。你必须调整它以适应你的需要。还有其他问题需要考虑——比如重复的条目。