2017-08-28 29 views
1

我有兩個客戶表和事務表。事務表有兩個外鍵,它們引用客戶表中的兩個字段。MySQL錯誤[1215] [HY000] - 無法添加外鍵

我添加客戶表,但是當我嘗試添加事務表,它給了我:

SQL錯誤[1215] [HY000]無法添加外鍵約束

以下是我的桌子。

CREATE TABLE customerDetails(
    CustomerID varchar(10)NOT NULL, 
    AccountNumber varchar(15) NOT NULL, 
    CustomerName varchar(60)NOT NULL, 
    Address varchar(60), 
    phone varchar(15), 
    email varchar(50), 
    joinedDate date, 
    primary key(CustomerID) 
) 

CREATE TABLE transactions(
    TraceNumber varchar(30) NOT NULL, 
    AccountNumber varchar(15)NOT NULL, 
    CustomerName varchar(60)NOT NULL, 
    TransactionType varchar(15) NOT NULL, 
    TransactionDateTime datetime NOT NULL, 
    TransactionAmount double DEFAULT NULL, 
    PRIMARY KEY (TraceNumber), 
    FOREIGN KEY(CustomerName) REFERENCES customerDetails(CustomerName), 
    FOREIGN KEY(AccountNumber) REFERENCES customerDetails(AccountNumber) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8; 
+4

customerDetails(CustomerName)必須是pk或唯一的。 – jarlh

+1

在交易中保留客戶名稱看起來像一個糟糕的主意(並且是冗餘的) - 名稱不太可能是唯一的,如果名稱發生更改,會發生什麼情況。 –

+1

@P.Salmon在許多情況下,保留客戶詳細信息與交易時的法律要求相同。達到此目的的一種方法是將它們保存到交易表中。這不是很好,但通常很有用。 – Shadow

回答

4

問題就在這裏:

FOREIGN KEY(AccountNumber) REFERENCES customerDetails(AccountNumber) 

製作外鍵關係,父表列必須是主鍵或唯一的,但在你的情況,AccountNumber既不是主要的,也不是唯一的。所以相應地改變它。

+0

感謝Mayank。您的解決方案解決了問題。 –

3

您應該使用CustomerID,因爲您已創建customerDetails表,主列爲CustomerID列。 CustomerID應該被稱爲外鍵而不是customerName

使用以下結構創建transactions表。

此外,您不需要在此處映射AccountNumber,因爲您要映射到CustomerID

CREATE TABLE transactions(
    TraceNumber varchar(30) NOT NULL, 
    AccountNumber varchar(15)NOT NULL, 
    CustomerID INT NOT NULL, 
    TransactionType varchar(15) NOT NULL, 
    TransactionDateTime datetime NOT NULL, 
    TransactionAmount double DEFAULT NULL, 
    PRIMARY KEY (TraceNumber), 
    FOREIGN KEY(CustomerName) REFERENCES customerDetails(CustomerID) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8; 
+0

感謝Vignesh的回答。但這是我應該根據項目的要求進行映射的方式。總之它是一個有用的答案。 –

相關問題