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

Posted

技术标签:

【中文标题】使用 Perl,如何在保持参照完整性的同时从单个表加载多个表?【英文标题】:Using Perl, how do I load multiple tables from a single table while keeping referential integrity? 【发布时间】:2010-11-14 15:52:29 【问题描述】:

需要将具有 100,000+ 条记录的单个文件中的数据加载到 mysql 上的多个表中,维护文件/表中定义的关系;表示关系已经匹配。解决方案需要在最新版本的 MySQL 上运行,并且需要使用 InnoDB 引擎; MyISAM 不支持外键。

我是使用 Perl 的新手,任何指针都将不胜感激。

我可能会补充一点,在加载数据期间,外键约束不被禁用是一项要求。由于我的理解是,如果数据库的引用完整性出现问题,当重新打开外键约束时,MySQL 将不会检查引用完整性。 来源: 5.1.4。服务器系统变量 -- foreign_key_checks

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

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

如果 Perl 不适合这个,请解释原因,如果可能的话,建议另一种方法。之所以选择 Perl,是因为客户的团队已经部署了 40-65 个 Perl 脚本,并且有很多员工能够阅读/编辑它。

谢谢!


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

文件:

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)

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

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 DDL:

create database MyOffice2;

use MyOffice2;

CREATE TABLE Employee (
      id MEDIUMINT NOT NULL AUTO_INCREMENT,
      name CHAR(50) NOT NULL,
      PRIMARY KEY (id)
    ) ENGINE=InnoDB;

CREATE TABLE Office (
  id MEDIUMINT NOT NULL AUTO_INCREMENT,
  office_number INT NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB;

CREATE TABLE JobTitle (
  id MEDIUMINT NOT NULL AUTO_INCREMENT,
  title CHAR(30) NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB;

CREATE TABLE Employee2JobTitle (
  employee_id MEDIUMINT NOT NULL,
  job_title_id MEDIUMINT NOT NULL,
  FOREIGN KEY (employee_id) REFERENCES Employee(id),
  FOREIGN KEY (job_title_id) REFERENCES JobTitle(id),
  PRIMARY KEY (employee_id, job_title_id)
) ENGINE=InnoDB;

CREATE TABLE Employee2Office (
  employee_id MEDIUMINT NOT NULL,
  office_id MEDIUMINT NOT NULL,
  FOREIGN KEY (employee_id) REFERENCES Employee(id),
  FOREIGN KEY (office_id) REFERENCES Office(id),
  PRIMARY KEY (employee_id, office_id)
) ENGINE=InnoDB;

【问题讨论】:

【参考方案1】:

这听起来像是DBIx::Class 的工作。

【讨论】:

以上是关于使用 Perl,如何在保持参照完整性的同时从单个表加载多个表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在保持表关系完整性的同时从 MS Access 数据输入表单添加数据

参照完整性-外键约束

Redshift 中如何保持参照完整性?

access 不能建立删除查询。

参照完整性被破坏

数据库主外键