需要将包含100,000+记录的单个文件中的数据加载到MySQL上的多个表中,维护文件/表中定义的关系;这意味着这些关系已经匹配。该解决方案应该适用于最新版本的MySQL,并且需要使用InnoDB引擎;MyISAM不支持外键。
我是一个全新的使用Perl和任何指针将不胜感激。
我可以补充一点,在加载数据期间,不禁用外键约束是一项要求。因为我的理解是,如果数据库的引用完整性有问题,当外键约束打开时,MySQL将不会检查引用完整性。资料来源: 5.1.4。服务器系统变量- 检查
任何方法都应该包括一些来自验证和回滚策略,如果插入失败,或未能保持引用完整性。
再一次,这是全新的,我尽我最大的努力提供尽可能多的信息,如果你有任何问题,或要求澄清--请告诉我。
如果Perl不太适合这样做,请解释原因,如果可能的话,请提出另一种方法。之所以选择Perl作为选项,是因为客户机的团队已经部署了40-65个Perl脚本,并且工作人员中有许多人能够读取/编辑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“的情况下,只有一个John;这意味着没有重复会导致引用完整性冲突。
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;发布于 2010-11-14 17:19:23
这听起来像是DBIx::Class的工作。
https://stackoverflow.com/questions/4178252
复制相似问题