在MySQL中,如何从一个表加载多个表,同时保持引用完整性?

在MySQL中,如何从一个表加载多个表,同时保持引用完整性?,mysql,insert,flat-file,referential-integrity,Mysql,Insert,Flat File,Referential Integrity,更新:“将外键检查设置为1不会触发对现有表数据的扫描。因此,当外键检查=0时添加到表中的行将不会验证一致性。”来源:5.1.4。服务器系统变量--因此,关闭外键检查似乎不是一个选项… 需要将数据从一个包含100000多条记录的文件加载到MySQL上的多个表中,维护文件/表中定义的关系;意味着关系已经匹配。该解决方案应适用于最新版本的MySQL,并且可以使用InnoDB或MyISAM引擎 我是一个完全陌生的人,对自动生成ID和建立外键关系几乎没有经验。任何指点都将不胜感激 请参见上面的更新说明:我

更新:“将外键检查设置为1不会触发对现有表数据的扫描。因此,当外键检查=0时添加到表中的行将不会验证一致性。”来源:5.1.4。服务器系统变量--因此,关闭外键检查似乎不是一个选项…

需要将数据从一个包含100000多条记录的文件加载到MySQL上的多个表中,维护文件/表中定义的关系;意味着关系已经匹配。该解决方案应适用于最新版本的MySQL,并且可以使用InnoDB或MyISAM引擎

我是一个完全陌生的人,对自动生成ID和建立外键关系几乎没有经验。任何指点都将不胜感激

请参见上面的更新说明:我可能需要补充的是,不需要对实时数据库进行更新,这意味着可以禁用外键约束,然后执行插入,再次启用约束。因为我的理解是,如果数据库的引用完整性有问题,操作就会失败。

所有方法都应该包括一些来自验证和回滚/清除策略,以防插入失败或无法维护引用完整性

再次重申,这是一个全新的概念,我会尽力提供尽可能多的信息,如果您有任何问题或要求澄清,请告诉我

谢谢


示例数据:为了更好地用一个示例进行阐述,让我们假设我正在加载一个文件,其中包含员工姓名、他们过去占用过的办公室以及他们的职务历史,并用一个选项卡隔开

文件:

如何使用MySQL将文件加载到上面的模式中,为员工、办公室和职务自动生成ID,并维护员工和办公室以及员工和职务之间的关系

所以在这种情况下。这些表应该如下所示:

Employee
1 John Smith
2 Alex Button

Office
1 501
2 601
3 701
4 454

JobTitle
1 Engineer
2 Senior Engineer
3 Manager
4 Senior Assistant

Employee2Office
1 1
1 2
1 3
2 2
2 4

Employee2JobTitle
1 1
1 2
1 3
2 4
2 3

我会将所有文件上载到具有以下表格的暂存数据库中:

Employee (nId, name)
Office (nId, number)
JobTitle (nId, titleName)
Employee2Office (nEmpID, nOfficeId)
Employee2JobTitle (nEmpId, nJobTitleID)
临时雇员(nId,姓名) 临时办公室(nId,编号)


这些桌子上不会有违禁品或FK。如果上传了记录,那么你可以为记录添加id,检查完整性,然后将它们移动到实时数据库(禁用fks,移动数据,再次启用fks)

@Zoltan Hamori:可能我不理解你,但听起来你建议我手动添加id,对吗?我想我的理解是,让MySQL在每次发现新实例时生成它们更有意义。另外,您确实需要答案,以获得从头到尾完成任务所需的SQL语句。当临时表中填充了记录时,您只需使用序列更新id列,即可实现自动化。例如:更新临时员工集ID=seq\u emp。NEXTVAL@Zoltan在调查你的建议时,我遇到了一个问题,我错了。。。如果关闭了“外键检查”,当它重新打开时,数据库不会重新检查数据库的引用完整性,因此关闭它不是一个选项。。。有什么建议吗?我在我的问题主体中添加了一个更新,链接到MySQL文档,说明了这一点。谢谢好的,我明白了。可以将行追加到表中吗?@Zoltan Hamori:追加是指批量追加,还是逐行追加?
Employee
1 John Smith
2 Alex Button

Office
1 501
2 601
3 701
4 454

JobTitle
1 Engineer
2 Senior Engineer
3 Manager
4 Senior Assistant

Employee2Office
1 1
1 2
1 3
2 2
2 4

Employee2JobTitle
1 1
1 2
1 3
2 4
2 3