需要将具有 100,000+ 条记录的单个文件中的数据加载到 MySQL 上的多个表中,维护文件/表中定义的关系;表示关系已经匹配。解决方案需要在最新版本的 MySQL 上运行,并且需要使用 InnoDB 引擎;MyISAM 不支持外键。
我是使用 Pentaho 数据集成(又名 Kettle)的新手,任何指针都将不胜感激。
我可能会补充一点,要求不禁用外键约束。由于我的理解是,如果数据库的引用完整性出现问题,当重新打开外键约束时,MySQL 将不会检查引用完整性。资料来源: 5.1.4。服务器系统变量——foreign_key_checks
所有方法都应该包括一些验证和回滚策略,以防插入失败或无法保持引用完整性。
再次,对此完全陌生,并尽我所能提供尽可能多的信息,如果您有任何问题或要求澄清 - 请告诉我。
如果您能够从 kjb 和 ktr 文件(作业/转换)中发布 XML,那将是 SUPER。甚至可能追查您在任何地方所做的每条评论/答案并投票给他们... :-) ...真的,找到答案对我来说真的很重要。
谢谢!
样本数据:为了更好地举例说明,假设我正在尝试加载一个文件,其中包含员工姓名、他们过去占用的办公室以及他们的职位历史记录,由选项卡分隔。
文件:
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;
我对选定答案的回应:
准备:
<TAB>
(a) 使用示例数据,通过更改为逗号分隔创建 CSV 。- (b) 安装 MySQL 并使用 MySQL DDL 示例创建示例数据库
- (c) 安装 Kettle(它基于 Java,可以在任何运行 Java 的设备上运行)
- (d) 下载 KTR 文件
分步数据流:(我的笔记)
- 在 Kettle 中打开 KTR 文件,然后双击“CSV 文件输入”并浏览到您创建的 CSV 文件。分隔符应该已经设置为逗号。然后单击确定。
- 双击“插入员工”并选择数据库连接器,然后按照创建新数据库连接上的这些说明进行操作