2017-06-01 140 views
0

我很沮喪。我無法爲表Test_info添加外鍵約束:爲什麼不能添加這個外鍵約束?

FOREIGN KEY Test_info(score) REFERENCES Test(score) 

它一直給我提供錯誤1215無法添加外鍵約束。我確定數據類型是一樣的,以及名稱等...任何人?

整個SQL表的創建是:

CREATE TABLE IF NOT EXISTS Employees (
    ssn VARCHAR(20), 
    union_mem_no VARCHAR(20), 
    PRIMARY KEY (ssn) 
) ENGINE=INNODB; 

CREATE TABLE IF NOT EXISTS Traffic_Control (
    ssn VARCHAR(20), 
    exam_date DATE, 
    PRIMARY KEY (ssn), 
    FOREIGN KEY (ssn) REFERENCES Employees(ssn) ON DELETE CASCADE 
) ENGINE=INNODB; 

CREATE TABLE IF NOT EXISTS Technician (
    ssn VARCHAR(20), 
    T_name VARCHAR(20), 
    phone_num VARCHAR(20), 
    address VARCHAR(50), 
    Salary INT, 
    PRIMARY KEY (ssn), 
    FOREIGN KEY (ssn) REFERENCES Employees(ssn) ON DELETE CASCADE 
) ENGINE=INNODB; 

CREATE TABLE IF NOT EXISTS Model (
    model_no VARCHAR(20), 
    Capacity INT, 
    Weight INT, 
    PRIMARY KEY (model_no) 
) ENGINE=INNODB; 

CREATE TABLE IF NOT EXISTS Expert (
    ssn VARCHAR(20), 
    model_no VARCHAR(20), 
    FOREIGN KEY (ssn) REFERENCES Technician(ssn) ON DELETE CASCADE, 
    FOREIGN KEY (model_no) REFERENCES Model(model_no) ON DELETE CASCADE 
) ENGINE=INNODB; 

CREATE TABLE IF NOT EXISTS Plane (
    reg_no VARCHAR(20), 
    PRIMARY KEY (reg_no) 
) ENGINE=INNODB; 

CREATE TABLE IF NOT EXISTS Type (
    reg_no VARCHAR(20), 
    model_no VARCHAR(20), 
    FOREIGN KEY (reg_no) REFERENCES Plane(reg_no), 
    FOREIGN KEY (model_no) REFERENCES Model(model_no) 
) ENGINE=INNODB; 

CREATE TABLE IF NOT EXISTS Test (
    FAA_no VARCHAR(20), 
    T_name VARCHAR(20), 
    score INT, 
    PRIMARY KEY (FAA_no) 
) ENGINE=INNODB; 

CREATE TABLE IF NOT EXISTS Test_info (
    ssn VARCHAR(20), 
    FAA_no VARCHAR(20), 
    T_date DATE NOT NULL, 
    hours INT, 
    score INT, 
    PRIMARY KEY (ssn, FAA_no), 
    FOREIGN KEY (ssn) REFERENCES Employees(ssn) ON DELETE CASCADE, 
    FOREIGN KEY (FAA_no) REFERENCES Test(FAA_no), 
    FOREIGN KEY (score) REFERENCES Test(score) 
) ENGINE=INNODB; 
+2

雖然不是「法律」,FK到PK是常態,無論它是什麼必須是唯一的。不知道你打算爲這個FK。這裏有什麼想法? – LoztInSpace

+0

@LoztInSpace我的印象是外鍵簡單地連接了兩個表中的數據。我應該更清楚地知道,外鍵仍然是一個關鍵。我的錯。感謝您的洞察力。 – noobcoder

回答

1

你必須定義您所引用,以便能夠建立一個外鍵關係,該列的列的唯一約束。

但是,從您的數據架構看起來,score列可能沒有唯一值。

由於您已經與Test表的主鍵(FAA_no)建立了外鍵關係,我沒有看到添加第二個外鍵的要點。

+0

我不認爲我明白你的意思..外鍵是否必須引用主鍵? – noobcoder

+2

不一定是主鍵。只需要有一個具有UNIQUE約束的列。 –

+0

明白了。謝謝!學到了新東西。 – noobcoder