无法添加外键约束 - MySQL错误1215(HY000) [英] Cannot add foreign key constraint - MySQL ERROR 1215 (HY000)
问题描述
错误1215(HY000):Can not not find it。添加外键约束
CREATE TABLE销售(
saleId int(100)NOT NULL AUTO_INCREMENT,
accountNo int(100)NOT NULL,
payName VARCHAR(100) NOT NULL,
nextPayment DATE,
supplementName VARCHAR(250),
qty int(11),
workoutName VARCHAR(100),
sDate datetime NOT NULL DEFAULT NOW (),
totalAmount DECIMAL(11,2)NOT NULL,
CONSTRAINT PRIMARY KEY(saleId,accountNo,payName),
CONSTRAINT FOREIGN KEY(accountNo)REFERENCES accounts(accountNo)ON DELETE CASCADE ON UPDATE CASCADE
CONSTRAINT FOREIGN KEY(payName)REFERENCECES paymentFor(payName)ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT FOREIGN KEY(supplementName)REFERENCES Supplements(supplementName)ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT FOREIGN KEY(workoutName)REFERENCES锻炼(worko utName)ON DELETE CASCADE ON UPDATE CASCADE
);
ALTER TABLE sales AUTO_INCREMENT = 2001;
以下是父表。
<$ p (100)NOT NULL AUTO_INCREMENT,
accountType VARCHAR(100)NOT NULL,
firstName VARCHAR(50)NOT NULL,$ b $ CREATE TABLE accounts(
accountNo int
lastName VARCHAR(60)NOT NULL,
birthdate DATE NOT NULL,
性别VARCHAR(7),
city VARCHAR(50)NOT NULL,
street VARCHAR 50),
cellPhone VARCHAR(10),
emergencyPhone VARCHAR(10),
email VARCHAR(150)NOT NULL,
description VARCHAR(350),
VARCHAR(50),
createdOn datetime NOT NULL DEFAULT NOW(),
CONSTRAINT PRIMARY KEY(accountNo)
);
ALTER TABLE accounts AUTO_INCREMENT = 1001;
CREATE TABLE补充(
supplementaryId int(100)NOT NULL AUTO_INCREMENT,
supplementName VARCHAR(250)NOT NULL $ b $ manufacture VARCHAR(100) ,
description VARCHAR(150),
qtyOnHand INT(5),
unitPrice DECIMAL(11,2),
manufactureDate DATE,
expirationDate DATE,
CONSTRAINT PRIMARY KEY(supplementId,supplementName)
);
ALTER TABLE补充AUTO_INCREMENT = 3001;
CREATE TABLE workouts(
workoutId int(100)NOT NULL AUTO_INCREMENT,
workoutName VARCHAR(100)NOT NULL,
description VARCHAR(7500)NOT NULL,
duration VARCHAR(30),
CONSTRAINT PRIMARY KEY(workoutId,workoutName)
);
ALTER TABLE锻炼AUTO_INCREMENT = 4001;
CREATE TABLE paymentFor(
payId int(100)NOT NULL AUTO_INCREMENT,
payName VARCHAR(100)NOT NULL,
amount DECIMAL(11,2),
CONSTRAINT PRIMARY KEY(payId,payName)
);
ALTER TABLE paymentFor AUTO_INCREMENT = 5001;
你们可以帮我解决这个问题吗?感谢。
对于一个字段被定义为外键
,所引用的父字段必须定义一个索引。
根据外键
约束的文档: / b>
$ b
参考资料parent_tbl_name(index_col_name,...)
在 workouts.workoutName
, paymentFor.paymentName $ c>上定义
INDEX
$ c>和 supplemental.supplementName
。并确保子列的定义必须与其父列定义匹配。
更改锻炼
表格定义如下:
<$ p (100)NOT NULL AUTO_INCREMENT,
workoutName VARCHAR(100)NOT NULL,
description VARCHAR(7500)NOT NULL,$ b $ CREATE TABLE workouts(
workoutId int
duration VARCHAR(30),
KEY(workoutName), - < ----这是新添加的索引键
CONSTRAINT PRIMARY KEY(workoutId ,workoutName)
);
更改补充
表格定义如下: / b>
CREATE TABLE补充(
supplementaryId int(100)NOT NULL AUTO_INCREMENT,
supplementName VARCHAR(250)NOT NULL,
manufacture VARCHAR(100),
description VARCHAR(150),
qtyOnHand INT(5),
unitPrice DECIMAL(11,2),
manufactureDate DATE ,
expirationDate DATE,
KEY(supplementName), - < ----这是新添加的索引键
CONSTRAINT PRIMARY KEY(supplementId,supplementName )
);
更改 paymentFor
表格定义如下: / b>
CREATE TABLE paymentFor(
payId int(100)NOT NULL AUTO_INCREMENT,
payName VARCHAR(100)NOT NULL,
amount DECIMAL(11,2),
KEY(payName), - < ----这是新添加的索引键
CONSTRAINT主键(payId,payName)
);
现在,更改子表定义如下:
CREATE TABLE sales(
saleId int(100)NOT NULL AUTO_INCREMENT,
accountNo int(100)NOT NULL,
payName VARCHAR(100) NOT NULL,
nextPayment DATE,
supplementName VARCHAR(250)NOT NULL,
qty int(11),
workoutName VARCHAR(100)NOT NULL,
sDate datetime NOT NULL DEFAULT NOW(),
totalAmount DECIMAL(11,2)NOT NULL,
CONSTRAINT PRIMARY KEY(saleId,accountNo,payName),
CONSTRAINT FOREIGN KEY(accountNo)
参考账户(accountNo)
ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT FOREIGN KEY(payName)
REFERENCES paymentFor(payName)
ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT FOREIGN KEY(supplementName)
REFERENCES补充(supplementName)
ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT FOREIGN KEY(workoutName)
REFERENCES workouts(workoutName)
ON DELETE CASCADE ON UPDATE CASCADE
);
请参阅:
[index_name](index_col_name,...)
REFERENCES tbl_name(index_col_name,...)
[ON DELETE reference_option] <
[ON UPDATE reference_option]
reference_option:
RESTRICT | CASCADE | SET NULL | NO ACTION
I am trying to create database for gym management system, but I can't figure out why I am getting this error. I've tried to search for the answer here, but I couldn't find it.
ERROR 1215 (HY000): Cannot add foreign key constraint
CREATE TABLE sales(
saleId int(100) NOT NULL AUTO_INCREMENT,
accountNo int(100) NOT NULL,
payName VARCHAR(100) NOT NULL,
nextPayment DATE,
supplementName VARCHAR(250),
qty int(11),
workoutName VARCHAR(100),
sDate datetime NOT NULL DEFAULT NOW(),
totalAmount DECIMAL(11,2) NOT NULL,
CONSTRAINT PRIMARY KEY(saleId, accountNo, payName),
CONSTRAINT FOREIGN KEY(accountNo) REFERENCES accounts(accountNo) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT FOREIGN KEY(payName) REFERENCES paymentFor(payName) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT FOREIGN KEY(supplementName) REFERENCES supplements(supplementName) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT FOREIGN KEY(workoutName) REFERENCES workouts(workoutName) ON DELETE CASCADE ON UPDATE CASCADE
);
ALTER TABLE sales AUTO_INCREMENT = 2001;
Here is the parent tables.
CREATE TABLE accounts(
accountNo int(100) NOT NULL AUTO_INCREMENT,
accountType VARCHAR(100) NOT NULL,
firstName VARCHAR(50) NOT NULL,
lastName VARCHAR(60) NOT NULL,
birthdate DATE NOT NULL,
gender VARCHAR(7),
city VARCHAR(50) NOT NULL,
street VARCHAR(50),
cellPhone VARCHAR(10),
emergencyPhone VARCHAR(10),
email VARCHAR(150) NOT NULL,
description VARCHAR(350),
occupation VARCHAR(50),
createdOn datetime NOT NULL DEFAULT NOW(),
CONSTRAINT PRIMARY KEY(accountNo)
);
ALTER TABLE accounts AUTO_INCREMENT = 1001;
CREATE TABLE supplements(
supplementId int(100) NOT NULL AUTO_INCREMENT,
supplementName VARCHAR(250) NOT NULL,
manufacture VARCHAR(100),
description VARCHAR(150),
qtyOnHand INT(5),
unitPrice DECIMAL(11,2),
manufactureDate DATE,
expirationDate DATE,
CONSTRAINT PRIMARY KEY(supplementId, supplementName)
);
ALTER TABLE supplements AUTO_INCREMENT = 3001;
CREATE TABLE workouts(
workoutId int(100) NOT NULL AUTO_INCREMENT,
workoutName VARCHAR(100) NOT NULL,
description VARCHAR(7500) NOT NULL,
duration VARCHAR(30),
CONSTRAINT PRIMARY KEY(workoutId, workoutName)
);
ALTER TABLE workouts AUTO_INCREMENT = 4001;
CREATE TABLE paymentFor(
payId int(100) NOT NULL AUTO_INCREMENT,
payName VARCHAR(100) NOT NULL,
amount DECIMAL(11,2),
CONSTRAINT PRIMARY KEY(payId, payName)
);
ALTER TABLE paymentFor AUTO_INCREMENT = 5001;
Can you guys help me with this problem? Thanks.
For a field to be defined as a foreign key
, the referenced parent field must have an index defined on it.
As per documentation on foreign key
constraints:
REFERENCES parent_tbl_name (index_col_name,...)
Define an INDEX
on workouts.workoutName
, paymentFor.paymentName
, and supplements.supplementName
respectively. And make sure that child column definitions must match with those of their parent column definitions.
Change workouts
table definition as below:
CREATE TABLE workouts(
workoutId int(100) NOT NULL AUTO_INCREMENT,
workoutName VARCHAR(100) NOT NULL,
description VARCHAR(7500) NOT NULL,
duration VARCHAR(30),
KEY ( workoutName ), -- <---- this is newly added index key
CONSTRAINT PRIMARY KEY(workoutId, workoutName)
);
Change supplements
table definition as below:
CREATE TABLE supplements(
supplementId int(100) NOT NULL AUTO_INCREMENT,
supplementName VARCHAR(250) NOT NULL,
manufacture VARCHAR(100),
description VARCHAR(150),
qtyOnHand INT(5),
unitPrice DECIMAL(11,2),
manufactureDate DATE,
expirationDate DATE,
KEY ( supplementName ), -- <---- this is newly added index key
CONSTRAINT PRIMARY KEY(supplementId, supplementName)
);
Change paymentFor
table definition as below:
CREATE TABLE paymentFor(
payId int(100) NOT NULL AUTO_INCREMENT,
payName VARCHAR(100) NOT NULL,
amount DECIMAL(11,2),
KEY ( payName ), -- <---- this is newly added index key
CONSTRAINT PRIMARY KEY(payId, payName)
);
Now, change child table definition as below:
CREATE TABLE sales(
saleId int(100) NOT NULL AUTO_INCREMENT,
accountNo int(100) NOT NULL,
payName VARCHAR(100) NOT NULL,
nextPayment DATE,
supplementName VARCHAR(250) NOT NULL,
qty int(11),
workoutName VARCHAR(100) NOT NULL,
sDate datetime NOT NULL DEFAULT NOW(),
totalAmount DECIMAL(11,2) NOT NULL,
CONSTRAINT PRIMARY KEY(saleId, accountNo, payName),
CONSTRAINT FOREIGN KEY(accountNo)
REFERENCES accounts(accountNo)
ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT FOREIGN KEY(payName)
REFERENCES paymentFor(payName)
ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT FOREIGN KEY(supplementName)
REFERENCES supplements(supplementName)
ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT FOREIGN KEY(workoutName)
REFERENCES workouts(workoutName)
ON DELETE CASCADE ON UPDATE CASCADE
);
Refer to:
[CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name, ...)
REFERENCES tbl_name (index_col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]reference_option:
RESTRICT | CASCADE | SET NULL | NO ACTION
这篇关于无法添加外键约束 - MySQL错误1215(HY000)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!