为什么不能添加这个外键约束?

问题描述:

我很沮丧。我无法为表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

你必须定义您所引用,以便能够建立一个外键关系,该列的列的唯一约束。

但是,从您的数据架构看起来,score列可能没有唯一值。

由于您已经与Test表的主键(FAA_no)建立了外键关系,我没有看到添加第二个外键的要点。

+0

我不认为我明白你的意思..外键是否必须引用主键? – noobcoder

+2

不一定是主键。只需要有一个具有UNIQUE约束的列。 –

+0

明白了。谢谢!学到了新东西。 – noobcoder