在MySQL中,如何在保持参照完整性的同时从单个表中加载多个表?

时间:2010-11-10 14:57:37

标签: mysql insert flat-file referential-integrity

UPDATE:“将foreign_key_checks设置为1不会触发现有表数据的扫描。因此,在foreign_key_checks = 0时添加到表中的行将不会被验证是否一致。”消息来源:5.1.4。服务器系统变量 - foreign_key_checks - 因此,它显示为关闭foreign_key_checks不是一个选项......

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

我对这一切都是全新的,并且很少有自动生成ID和建立外键关系的经验。任何指针都会受到赞赏。

请参阅上面的更新说明: 我可能会补充说,不要求在实时数据库上进行更新,这意味着可以禁用外键约束,然后执行insert,再次启用约束。由于我的理解是,如果数据库的参照完整性出现问题,操作将失败。

如果插入失败,或者无法保持参照完整性,则所有方法都应包括验证和回滚/清理策略中的一些。

同样,对此全新,并尽力提供尽可能多的信息,如果您有任何疑问或要求澄清 - 请告诉我。

谢谢!


示例数据:为了更好地举例说明,我们假设我正在尝试加载包含员工姓名的文件,他们过去占用的办公室以及由标签分隔的职位名称历史记录

文件:

EmployeeName<tab>OfficeHistory<tab>JobLevelHistory
John Smith<tab>501<tab>Engineer
John Smith<tab>601<tab>Senior Engineer
John Smith<tab>701<tab>Manager
Alex Button<tab>601<tab>Senior Assistant
Alex Button<tab>454<tab>Manager

注意:单个表数据库是完全规范化的(与单个表一样多) - 例如,在“John Smith”的情况下,只有一个John Smith;意思是没有重复会导致参照完整性的冲突。

MyOffice数据库架构包含以下表格:

Employee (nId, name)
Office (nId, number)
JobTitle (nId, titleName)
Employee2Office (nEmpID, nOfficeId)
Employee2JobTitle (nEmpId, nJobTitleID)

如何使用MySQL将文件加载到自动生成员工,Office和JobTitle的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

1 个答案:

答案 0 :(得分:1)

我会将所有文件上传到具有以下表格的登台数据库:

Temp_Employee(nId,name) Temp_Office(nId,number) ...

这些表格上没有约束或FK。如果上传了记录,那么您可以为记录添加id,检查完整性,然后将它们移动到实时数据库(禁用fks,移动数据,再次启用fks)