2017-04-14 79 views
0

我有2個SQL語句如下:創建新表失敗,錯誤消息「外鍵約束的格式不正確」

CREATE TABLE IF NOT EXISTS countries 
(
    country_id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, 
    country varchar(45) NOT NULL 
); 

CREATE TABLE IF NOT EXISTS patients 
(
    p_id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, 
    p_fname varchar(50) NOT NULL, 
    p_mname varchar(10) NULL, 
    p_lname varchar(50) NOT NULL, 
    age INT NOT NULL, 
    sex SET ('Male','Female'), 
    phone_num_mobile varchar(10) NULL, 
    phone_num_res varchar(7) NULL, 
    phone_num_office varchar(7) NULL, 
    email varchar(75) NULL, 
    addr_house varchar(10) NULL, 
    addr_street1 varchar(45) NOT NULL, 
    addr_street2 varchar(45) NULL, 
    addr_street3 varchar(45) NULL, 
    addr_city varchar(20) NOT NULL, 
    addr_country varchar(45) NOT NULL, 
    occupation varchar(20) NOT NULL, 
    married BOOLEAN NOT NULL, 
    FOREIGN KEY(addr_country) REFERENCES countries(country) 
); 

第一個成功執行,第二個,它的外鍵分配上一個表,無法執行消息「外鍵約束錯誤地形成」。我也嘗試改變第二個查詢的外鍵字段(addr_country)與「國家」表(國家)的名稱相同,但它是無效的。

任何人都可以請解釋我發生了什麼事情,並建議我解決這個問題?

在此先感謝。

+0

你爲什麼不引用country_id字段? CONSTRAINT'fk_patient_country'FOREIGN KEY(addr_country)REFERENCES國家(國家) – Kevin

+1

在您的患者表中您應該有country_id而不是國家,這是一個更好的設計練習 – Kevin

+0

建議您使用2-char標準國家代碼,而不是4字節的INT。 –

回答

1

MariaDB中的外鍵只能引用另一個表中的主鍵或唯一鍵。在這種情況下,countries表已具有主鍵,因此您可以在country列中創建唯一鍵。

嘗試把唯一約束的country列在表countries

CREATE TABLE IF NOT EXISTS countries 
(
    country_id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, 
    country varchar(45) NOT NULL 
    UNIQUE KEY(country) 
); 

後期編輯:作爲評論者提到的,你可能只想引用country_id主鍵,而不是國名。由於世界上沒有兩個國傢俱有相同的名稱,所以可能在實踐中起作用。