2010-11-14 19 views
0

需要將具有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; 

回答

相關問題