MySQL错误[1215][HY000]-无法添加外键

MySQL错误[1215][HY000]-无法添加外键,mysql,sql,Mysql,Sql,我有两个表,分别是客户表和交易表。事务表有两个外键,它们引用客户表中的两个字段 我添加了customer表,但当我尝试添加transaction表时,它会给出: SQL错误[1215][HY000]无法添加外键约束 下面是我的桌子 CREATE TABLE customerDetails( CustomerID varchar(10)NOT NULL, AccountNumber varchar(15) NOT NULL, CustomerName varchar(60)

我有两个表,分别是客户表和交易表。事务表有两个外键,它们引用客户表中的两个字段

我添加了customer表,但当我尝试添加transaction表时,它会给出:

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;
问题在于:

FOREIGN KEY(AccountNumber) REFERENCES customerDetails(AccountNumber)
要建立外键关系,父表列必须是主键或唯一的,但在您的情况下,
AccountNumber
既不是主键也不是唯一的。因此,请相应地更改它。

问题在于:

FOREIGN KEY(AccountNumber) REFERENCES customerDetails(AccountNumber)

要建立外键关系,父表列必须是主键或唯一的,但在您的情况下,
AccountNumber
既不是主键也不是唯一的。因此,请相应地更改它。

您应该使用
CustomerID
,因为您已经创建了
customerDetails
表,其中主列为
CustomerID
CustomerID
应被称为外键,而不是
customerName

使用下面的结构创建
事务

此外,您不需要在此处映射
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;

您应该使用
CustomerID
,因为您已经创建了
customerDetails
表,表的主列为
CustomerID
CustomerID
应被称为外键,而不是
customerName

使用下面的结构创建
事务

此外,您不需要在此处映射
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;

customerDetails(CustomerName)必须是pk或唯一。在交易中保留客户名称看起来是个坏主意(而且是多余的)-名称不太可能是唯一的,如果名称发生更改会发生什么。@P.Salmon在许多情况下,法律要求保留交易时的客户详细信息。实现这一点的一种方法是将它们也保存到事务表中。这不好,但通常很有用。@shadow不好,更像是骇人听闻的,但确实有一些可怕的设计。@jarlh谢谢。它解决了这个问题。添加了CustomerName作为一个独特的字段。@P.Salmon和@Shadow是的,我理解在交易中保留客户名称是个坏主意,但这就是指定要求的方式。customerDetails(CustomerName)必须是pk或唯一的。在交易中保留客户名称看起来是个坏主意(而且是多余的)-名称不太可能是unigue,如果名称发生变化会发生什么情况。@P.Salmon在许多情况下,法律要求保留交易时的客户详细信息。实现这一点的一种方法是将它们也保存到事务表中。这不好,但通常很有用。@shadow不好,更像是骇人听闻的,但确实有一些可怕的设计。@jarlh谢谢。它解决了这个问题。添加了CustomerName作为一个独特的字段。@P.Salmon和@Shadow是的,我知道在交易中保留客户名称是一个坏主意,但这就是规定的要求。谢谢Mayank。您的解决方案解决了问题。谢谢Mayank。您的解决方案解决了这个问题。感谢Vignesh的回答。但这是我应该根据项目要求进行映射的方式。无论如何,这是一个有用的答案。感谢Vignesh的回答。但这是我应该根据项目要求进行映射的方式。无论如何,这是一个有用的答案。