我有多个表,它们似乎都没问题,但是我正在尝试创建这一个表,但它不会工作,因为我一直在获取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)
);
答案 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;
应该解决这个问题。