2017-08-28 74 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的回答。但这是我应该根据项目的要求进行映射的方式。总之它是一个有用的答案。 –

相关问题