【问题标题】:In MySQL, how do I load multiple tables from a single table while keeping referential integrity?在 MySQL 中,如何在保持引用完整性的同时从单个表中加载多个表?
【发布时间】:2010-11-10 14:57:37
【问题描述】:

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

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

我对这一切完全陌生,对自动生成 ID 和建立外键关系几乎没有经验。任何指针将不胜感激。

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

所有方法都应包括一些验证和回滚/清理策略,以防插入失败或无法保持引用完整性。

再次重申,对此完全陌生,如果您有任何问题或要求澄清,请尽我所能提供尽可能多的信息 - 请告诉我。

谢谢!


样本数据: 为了更好地举例说明,假设我正在尝试加载一个文件,其中包含员工姓名、他们过去曾占用的办公室以及他们的职位历史记录,由选项卡分隔.

文件:

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 将文件加载到上述架构中自动生成员工、办公室和职位名称的 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

【问题讨论】:

    标签: mysql insert flat-file referential-integrity


    【解决方案1】:

    我会将所有文件上传到包含以下表格的临时数据库中:

    Temp_Employee(nId,姓名) Temp_Office (nId, number) ...

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

    【讨论】:

    • @Zoltan Hamori:可能我很想念你,但听起来你是在建议我手动添加 ID——对吗?我猜我的理解是,每次发现新实例时让 MySQL 生成它们会更有意义。另外,确实需要答案才能拥有从头到尾完成任务所需的 SQL 语句。
    • 当您的临时表填充了记录时,您只需使用序列更新 id 列,因此可以自动化。例如:UPDATE temp_employee SET ID=seq_emp.NEXTVAL
    • @Zoltan Hamori:在查看您的建议时,我遇到了一个问题,我错了...如果关闭 foreign_key_checks,当它重新打开时,数据库将不会返回检查数据库参照完整性,所以关闭它不是一种选择......有什么建议吗?我已经在我的问题正文中添加了一个更新,链接到说明这一点的 MySQL 文档。谢谢!
    • 好的,我明白了。是否可以将行追加到表中?
    • @Zoltan Hamori:追加是指批量还是逐行?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 2011-03-16
    相关资源
    最近更新 更多