2016-05-11 109 views
0

這就是我從無法添加外鍵約束(MySQL的錯誤-1215

CREATE TABLE EMPLOYEE(
ENUM DECIMAL(12) NOT NULL, 
FNAME VARCHAR(50) NOT NULL, 
INITIALS VARCHAR(5)  NULL, 
LNAME VARCHAR(50) NOT NULL, 
DOB  DATE   NULL, 
BLDG  DECIMAL(3) NOT NULL, 
STREET VARCHAR(50) NOT NULL, 
SUBURB VARCHAR(50) NOT NULL, 
STATE VARCHAR(5) NOT NULL, 
ZIPCODE DECIMAL(4) NOT NULL, 
    CONSTRAINT EMPLOYEE_PKEY PRIMARY KEY(ENUM)); 

讓我的外鍵關係表,我想創建一個新的表名爲EMPNAME但有錯誤添加我的外國時鍵約束

CREATE TABLE EMPNAME(
ENUM DECIMAL(12) NOT NULL, 
FNAME VARCHAR(50) NOT NULL, 
INITIALS VARCHAR(5)  NOT NULL, 
LNAME VARCHAR(50) NOT NULL, 
    CONSTRAINT EMPNAME_PKEY PRIMARY KEY(ENUM), 
    CONSTRAINT EMPNAME_FKEY FOREIGN KEY(ENUM, FNAME, INITIALS, LNAME) REFERENCES EMPLOYEE(ENUM, FNAME, INITIALS, LNAME) 

);

我沒有得到錯誤,如果我只設置主鍵枚舉作爲外鍵,但是當我使所有的屬性外鍵,我不斷收到錯誤。

感謝

+0

你也可以發佈錯誤嗎? –

+0

爲什麼你想提取名稱到一個單獨的表?需要考慮的兩件事:1)你可以有兩個或更多同名的員工,但他們是兩個不同的實體。 2)通過將名稱存儲在單獨的表中而獲得的存儲空間即使在有重複名稱的情況下也可忽略不計。一個額外的:你有一個名字的ID,爲什麼你使用所有的屬性字段來創建一個FK,這個ID有什麼問題? (使用屬性導致我們回到原來的問題:爲什麼你需要這張表?) – Pred

回答

0

你引用的列必須有索引,以用作外鍵,所以在您的employee表中添加這些列指數(ES):

CREATE TABLE EMPLOYEE (
    ENUM DECIMAL (12) NOT NULL, 
    FNAME VARCHAR (50) NOT NULL, 
    INITIALS VARCHAR (5) NULL, 
    LNAME VARCHAR (50) NOT NULL, 
    DOB DATE NULL, 
    BLDG DECIMAL (3) NOT NULL, 
    STREET VARCHAR (50) NOT NULL, 
    SUBURB VARCHAR (50) NOT NULL, 
    STATE VARCHAR (5) NOT NULL, 
    ZIPCODE DECIMAL (4) NOT NULL, 
    CONSTRAINT EMPLOYEE_PKEY PRIMARY KEY (ENUM), 
    INDEX `FKEYS` (ENUM, FNAME, INITIALS, LNAME) 
); 

然後,你就可以將您的約束添加到第二個表中。

+0

不只是一個索引,但它必須是唯一的。 – Pred

+0

@Pred你可以設置一個空值爲唯一的列嗎? –

+0

是的,但不建議。空值不相等,因此允許多個值,這對於人是重複的。 (順便說一句,這是ANSI標準如何定義的唯一約束。) – Pred

相關問題