无法将外键添加到mysql

时间:2017-01-04 18:36:14

标签: mysql mysql-error-1005

我有多个表,它们似乎都没问题,但是我正在尝试创建这一个表,但它不会工作,因为我一直在获取Error1005 "Foreign key constraint is incorrectly formed"

这是两张桌子。我不知道这似乎是什么问题。

CREATE TABLE Patient(             
ID INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE,
Name VARCHAR(255) NOT NULL, 
Age TINYINT UNSIGNED,
Sex VARCHAR(10),
Contact INT(11),
Email TEXT(2083), 
PRIMARY KEY(ID) 
);


CREATE TABLE Appointments (
Appointment_No INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE,
Name VARCHAR(255) NOT NULL,
Contact INT(11),
Date DATE NOT NULL,
Time TIME NOT NULL,
Reason TEXT(2083), 
PRIMARY KEY(Appointment_No),
FOREIGN KEY (Name, Contact) REFERENCES Patient (Name, Contact)

); 

4 个答案:

答案 0 :(得分:0)

按照我的说法,表结构应如下所示:

CREATE TABLE Patient(             
ID INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE,
Name VARCHAR(255) NOT NULL, 
Age TINYINT UNSIGNED,
Sex VARCHAR(10),
Contact INT(11),
Email TEXT(2083), 
PRIMARY KEY(ID) 
);

CREATE TABLE Appointments (
Appointment_No INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE,
Patient_ID INT UNSIGNED NOT NULL,
Date DATE NOT NULL,
Time TIME NOT NULL,
Reason TEXT(2083), 
PRIMARY KEY(Appointment_No),
FOREIGN KEY (Patient_ID) REFERENCES Patient (ID)

); 

答案 1 :(得分:0)

FOREIGN KEY (Name, Contact) REFERENCES Patient (Name, Contact)

Patient表中引用的列必须是键的一部分。理想情况下,您希望患者(姓名,联系人)成为唯一密钥,因为这样外键可以保证在Patient表中只引用一行。

但是在表定义中,Name和Contact列不是键的一部分。这就解释了为什么你的桌面设计会出现错误。

但你的桌子设计并不好。姓名和联系人不是一个独特的选择,因为两个人可以分享一个名字,理论上你甚至可以让两个同名的人有相同的联系方式(例如,前拳击手George Foreman将他的名字命名为儿子乔治)。

@Shadow是正确的,更好的方法是引用Patient(id),因为它已经保证是唯一的。

答案 2 :(得分:-1)

尝试将两个外键分成两行,如下所示:

FOREIGN KEY (Contact) REFERENCES Patient (Contact) 
FOREIGN KEY (Name) REFERENCES Patient (Name)

答案 3 :(得分:-1)

定义引擎,所以sql语句将结束 ENGINE = MyISAM;

应该解决这个问题。