需要將具有100,000個記錄的單個文件中的數據加載到MySQL上的多個表中,以維護文件/表中定義的關係;意味着關係已經匹配。該解決方案應該在最新版本的MySQL上運行,並且需要使用InnoDB引擎; MyISAM不支持外鍵。使用Perl,如何在保持參考完整性的同時從單個表中加載多個表?
我是一個全新的使用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
注:單表數據庫是完全標準化的(高達單個表而定) - 和例如,在「約翰·史密斯」的情況下,有隻有一個約翰史密斯;這意味着沒有會導致參照完整性衝突的重複。
的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謝謝,我來看看它。 – blunders 2010-11-14 17:33:06