【问题标题】:MySQL Error 1215 Foreign Key IssueMySQL 错误 1215 外键问题
【发布时间】:2013-10-24 11:53:12
【问题描述】:

试图弄清楚为什么我的代码会出现 1215 错误。我搜索了线程,查看了一大堆并尝试了对其他人有用的“解决方案”,但我似乎无法将此类修复应用于我的代码。代码如下(编辑把我的整个代码放进去):

CREATE DATABASE IF NOT EXISTS ERUS30114465;

USE ERUS30114465;

CREATE TABLE IF NOT EXISTS Employee
(
EmployeeID int(15),
PRIMARY KEY(EmployeeID),
FirstName varchar(40),
LastName varchar(40),
DateStarted date,
TaxNum int(9),
StoreID int(15)
)ENGINE = InnoDB;


CREATE TABLE IF NOT EXISTS Store
(
StoreID int(15),
PRIMARY KEY(StoreID),
Name varchar(40),
Email varchar(60),
Phone int(10),
Fax int(20),
StoreManager int(15),
SupervisingStoreID int(15),
FOREIGN KEY(SupervisingStoreID) REFERENCES Store(StoreID)   
)ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS Artist
(
ArtistID int(25),
PRIMARY KEY(ArtistID),
FirstName varchar(40),
LastName varchar(40),
DOB date,
Website varchar(255)
)ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS Category
(
CategoryID char(1) PRIMARY KEY,
Description varchar(255)
)ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS CD
(
CDNumber int(8),
CategoryID char(1),
Length int(6),
NumberOfTracks int(8),
ReleaseDate date,
ReorderLevel int(8), 
Title varchar (255),
PRIMARY KEY(CDNumber),
FOREIGN KEY(CategoryID) REFERENCES Category(CategoryID)
)ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS CDArtist
(
ArtistID int(25),
CDNumber int(8),    
FOREIGN KEY(ArtistID) REFERENCES Artist(ArtistID),
FOREIGN KEY(CDNumber) REFERENCES CD(CDNumber)
)ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS Transactions
(
TransactionID int(25),
TransDate date,
StoreNumber int(15),   
PRIMARY KEY(TransactionID),
FOREIGN KEY(StoreNumber) REFERENCES Store(StoreID)
)ENGINE = InnoDB;


CREATE TABLE IF NOT EXISTS TransactionDetails
(
CDNumber int(8),
TransactionID int(25),
Quantity int(8),
Discount int(2),
FOREIGN KEY (CDNumber) REFERENCES CD(CDNumber),
FOREIGN KEY (TransactionID) REFERENCES Transactions (TransactionID)
)ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS Inventory
(
CDNumber int(8),
StoreID int(15),
QuantityOnHand int(8),
QuantityOnOrder int(8),
FOREIGN KEY (CDNumber) REFERENCES CD(CDNumber),
FOREIGN KEY (StoreID) REFERENCES Store(StoreID)
)ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS Address
(
Tid char(1),
PRIMARY KEY(Tid),
AddressID int(30),
AddressType varchar(60),
FOREIGN KEY(AddressType) REFERENCES AddressType(AddressType),
Street varchar(255),
City varchar(255),
State varchar(255)
)ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS AddressType
(
AddressType varchar(60), 
PRIMARY KEY (AddressType),
Description varchar(255)
)ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS Customer
(
CustomerID int(25),
PRIMARY KEY(CustomerID),
FirstName varchar(60),
LastName varchar(60), 
Phone int(10)
)ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS CDPrice
(
EffectiveFrom date,
Price int(5),
Reason varchar(255),
CDNumber int(8),
PRIMARY KEY(EffectiveFrom),
FOREIGN KEY(CDNumber) REFERENCES CD(CDNumber)
)ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS CustomerOrder
(
CustomerOrderID int(25),
OrderDate date,
StoreID int(15),
CustomerID int(25),
PRIMARY KEY(CustomerOrderID), 
FOREIGN KEY(StoreID) REFERENCES Store(StoreID),
FOREIGN KEY(CustomerID) REFERENCES Customer(CustomerID)
)ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS OrderDetails
(
CDNumber int(8),
CustomerOrderID int(25),
DateArrived date,
DatePickedUp date,
Quantity int(8),
FOREIGN KEY(CDNumber) REFERENCES CD(CDNumber),
FOREIGN KEY(CustomerOrderID) REFERENCES CustomerOrder(CustomerOrderID)
)ENGINE = InnoDB;

"#1215 - Cannot add foreign key constraint "

所说的错误是(现在)与最后一张表有关OrderDetails

如果它盯着我的脸,我看不到它 -_- 我已经在更大的数据库上工作了大约 16 个小时......

任何帮助都非常感谢:D

【问题讨论】:

  • 如果您对表进行修改并运行这些create table if not exists,您可能会错误地不重新创建已更改的表。这是create table if not exists,不是alter table if different
  • 地址类型表放在地址sqlfiddle.com/#!2/98d01之前

标签: mysql key


【解决方案1】:

基本上DATE是MYSQL的保留关键字

如果您想使用,可以尝试使用反引号

CREATE TABLE IF NOT EXISTS `Transaction`
(
TransactionID int(25),
`Date` date,
StoreNumber int(15),   
PRIMARY KEY(TransactionID),
FOREIGN KEY(StoreNumber) REFERENCES Store(StoreID)
)ENGINE = InnoDB;


CREATE TABLE IF NOT EXISTS TransactionDetails
(
CDNumber int(8),
TransactionID int(25),
Quantity int(8),
Discount int(2),
FOREIGN KEY (CDNumber) REFERENCES CD(CDNumber),
FOREIGN KEY (TransactionID) REFERENCES `Transaction`(TransactionID)
)ENGINE = InnoDB;

【讨论】:

  • 我的东西Date字段也是MYSQL的保留关键字
  • 尝试了反引号,我得到了同样的错误,但是在你讨论 TRANSACTION 是保留字之后,我尝试更改 Transaction -> Transactions,如下所示: CREATE TABLE IF NOT EXISTS Transactions ( TransactionID int(25) , Date date, StoreNumber int(15), PRIMARY KEY(TransactionID), FOREIGN KEY(StoreNumber) REFERENCES Store(StoreID) )ENGINE = InnoDB;效果很好,虽然也改变了“日期”,谢谢大家
  • @user2915539,您检查过 Transaction 和 Transactions 表是否相同?
【解决方案2】:

事务不是保留字,至少在 5.5 http://dev.mysql.com/doc/mysqld-version-reference/en/mysqld-version-reference-reservedwords-5-5.html

我删除了对事务表中存储表的外键引用并且它起作用了。你确定你没有忘记创建存储表吗?或者如果存在,请确保两个列的类型和大小相同,并且两者表具有相同的引擎

http://sqlfiddle.com/#!2/6c82c

【讨论】:

  • 在我的最后一张表上出现同样的错误:如果不存在 CustomerOrder (CustomerOrderID int(25), OrderDate date, StoreID int(15), CustomerID int(25), PRIMARY KEY(CustomerOrderID),则创建表, 外键(StoreID) 参考存储(StoreID), 外键(CustomerID) 参考客户(CustomerID) )ENGINE = InnoDB;如果不存在则创建表 OrderDetails ( CDNumber int(8), CustomerOrderID int(25), DateArrived date, DatePickedUp date, Quantity int(8), FOREIGN KEY(CDNumber) REFERENCES CD(CDNumber), FOREIGN KEY(CustomerOrderID) REFERENCES CustomerOrder( CustomerOrderID) )ENGINE = InnoDB;不确定?
  • @user2915539 ​​确保引用的表和列存在。
  • @Mihai 据我所知他们是:/
  • @user2915539 ​​在原始帖子中发布所有表格,很难上下滚动检查字段并指出错误所在。
  • @Mihai 已经完成了,其他表也开始出现 1215 错误,这真的让我很头疼:/
猜你喜欢
  • 2018-09-15
  • 2023-03-13
  • 1970-01-01
  • 2020-11-17
  • 2013-12-25
  • 2014-03-25
  • 2014-09-15
  • 2013-06-02
相关资源
最近更新 更多