2017-01-04 107 views
0

我有多個表,它們似乎都很好,但有一個表,我試圖創建,但它不會工作,因爲我繼續得到Error1005 "Foreign key constraint is incorrectly formed"不能將外鍵添加到mysql

這是兩張表格。我不知道什麼似乎是問題。

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

請閱讀[外鍵](https://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html)和[3NF](https:// en。 wikipedia.org/wiki/Third_normal_form) –

回答

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) 

); 
+0

它的工作方式,但有一個原因,爲什麼你的方法工作,我的方式不是? – Mukund

+0

如果包含解釋,這將是最好的解決方案。 – Shadow

+0

您只能對父表中的主鍵列進行外鍵引用。您不能引用非主鍵列。 – rsh

-1

嘗試將兩個外鍵分成兩行是這樣的:

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

試過前面還是一樣的錯誤 – Mukund

-1

定義引擎,sql語句將以 結尾ENGINE = MyISAM;

它應該解決這個問題。

+0

能更清楚,請我是一個初學者,謝謝。 – Mukund

+1

myisam不支持外鍵。期。 – Shadow

+0

「CREATE TABLE約會( Appointment_No INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE, 名稱VARCHAR(255)NOT NULL, 聯繫INT(11), 日期:DATE NOT NULL, 時間時間NOT NULL, 原因文本(2083), PRIMARY KEY(Appointment_No), FOREIGN KEY(Name,Contact)參考患者(姓名,聯繫人) )ENGINE = MyISAM; 「 我假設你的默認引擎是InnoDB的具有外鍵http://dev.mysql.com/doc/refman/5.7/en/innodb-foreign-key-constraints.html – Sandeep

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

病人表中引用的列必須是一個關鍵的組成部分。理想情況下,您希望患者(姓名,聯繫人)成爲唯一的密鑰,因爲那麼外鍵將確保在患者表中確切地引用一行。

但是在您的表定義中,名稱和聯繫人列不是鍵的一部分。這就解釋了爲什麼你的桌子設計有錯誤。

但是你的餐桌設計不好。姓名和聯繫人並不是一個很好的選擇,因爲兩個人可以分享一個名字,理論上你甚至可以擁有兩個同名的人,並且具有相同的聯繫方式(例如,前拳擊手喬治福爾曼將他的五個兒子喬治)。

@Shadow是正確的,最好是參考Patient(id)來代替,因爲它保證已經是唯一的。

+0

不只是鍵的一部分,而是索引的第一列與外鍵中指定的順序完全相同。 – Shadow

+0

更重要的是,FK應該引用患者的ID,而不是名稱和聯繫人字段。 – Shadow

+0

如果名稱和聯繫人也是唯一的,這是個好主意嗎? – Mukund