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

Posted

技术标签:

【中文标题】MySQL 错误 [1215] [HY000] - 无法添加外键 [重复]【英文标题】:MySQL Error[1215][HY000] - Cannot add foreign key [duplicate] 【发布时间】:2018-02-05 12:13:20 【问题描述】:

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

我添加了客户表,但是当我尝试添加事务表时,它给了我:

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;

【问题讨论】:

customerDetails(CustomerName) 必须是 pk 或唯一的。 在交易中保留客户名称看起来是个坏主意(而且是多余的)——名称不太可能是唯一的,如果名称更改会发生什么。 @P.Salmon 在许多情况下,法律要求保留交易时的客户详细信息。实现此目的的一种方法是将它们也保存到事务表中。这不是很好,但通常很有用。 @shadow 不太好,更像是骇人听闻的,但确实有一些可怕的设计。 @jarlh 谢谢。它解决了这个问题。将 CustomerName 添加为唯一字段。 @P.Salmon 和 @Shadow 是的,我知道在交易中保留客户姓名是个坏主意,但这就是规定的要求。 【参考方案1】:

问题就在这里:

FOREIGN KEY(AccountNumber) REFERENCES customerDetails(AccountNumber)

为了建立外键关系,父表列必须是主键或唯一的,但在您的情况下,AccountNumber 既不是主键也不是唯一的。所以相应地改变它。

【讨论】:

感谢 Mayank。您的解决方案解决了问题。【参考方案2】:

您应该使用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;

【讨论】:

感谢 Vignesh 的回答。但这是我应该根据项目要求进行映射的方式。无论如何,这是一个有用的答案。

以上是关于MySQL 错误 [1215] [HY000] - 无法添加外键 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

mysql ERROR 1215 (HY000): Cannot add foreign key constraint

MySQL : ERROR 1215 (HY000): 无法添加外键约束

MySQL ERROR 1215 (HY000)的一个情况

mysql执行带外键的sql文件时出现mysql ERROR 1215 (HY000): Cannot add foreign key constraint的解决

SQLSTATE[HY000]:一般错误:1215 无法添加外键约束 [Laravel 7.0]

SQLSTATE[HY000]:一般错误:1215 无法添加外键约束 Laravel 5.8