【发布时间】: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 是的,我知道在交易中保留客户姓名是个坏主意,但这就是规定的要求。