首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >无法添加外键约束- MySQL错误1215 (HY000)

无法添加外键约束- MySQL错误1215 (HY000)
EN

Stack Overflow用户
提问于 2015-03-24 21:24:15
回答 8查看 61.6K关注 0票数 11

我正试图为健身房管理系统创建数据库,但我不知道为什么会出现这个错误。我试过在这里寻找答案,但我找不到。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;

这是父表。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;

你们能帮我解决这个问题吗?谢谢。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2015-03-24 22:13:36

对于要定义为foreign key的字段,引用的父字段必须在其上定义一个索引。

根据关于foreign key约束的文档:

参考文献parent_tbl_name (index_col_name,.)

分别在workouts.workoutNamepaymentFor.paymentNamesupplements.supplementName上定义一个paymentFor.paymentName。并确保子列定义必须与其父列定义的定义匹配。

更改workouts表定义如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)
);

更改supplements表定义如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)
);

更改paymentFor表定义如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)
);

现在,更改子表定义如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
);

[约束符号]外键 name 参考文献tbl_name (index_col_name,.) 关于删除reference_option reference_option: 限制\、级联、设置、空、\、不操作

票数 23
EN

Stack Overflow用户

发布于 2015-05-29 06:53:28

如果您想找出错误的原因,只需在命令下运行并查找“最新外键错误”。

命令运行:-

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> SHOW ENGINE INNODB STATUS

你会知道你犯这些错误的原因。

票数 34
EN

Stack Overflow用户

发布于 2015-04-06 21:46:15

外键是实现不同表中列之间的关系/约束的一种方法。

当从父表中更新或删除行时,有不同类别的约束影响它们的强制执行方式:

Cascade:如果从父表中删除一行,那么具有匹配FK值的子表中的任何行也将被删除。类似地,用于更改父表中的值。

Restrict:如果这样会破坏子表的FK约束,则不能从父表中删除一行。类似地,用于更改父表中的值。

No Action:非常类似于“限制”,只是父表上的任何事件/触发器都将在约束执行之前执行--给应用程序编写器使用存储过程解决任何◾约束冲突的选项。

Set NULL:如果NULL是子表中FK列的允许值,那么如果更新或删除父表中的关联数据,它将被设置为NULL。

Set Default:如果子表中的FK列有默认值,那么如果父表中的关联数据被更新或删除,它将被使用。请注意,在此版本中没有实现--可以将约束添加到架构中,但是对父表中列的任何后续删除或更新都将失败。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29248057

复制
相关文章
MySQL错误码1215:无法添加外键
1.检查两个字段的数据类型是否一致 2.检查两个字段的数据长度是否一致(有时候不指定int长度,长度是10,有时候是11)
冻冻肆
2021/10/05
2.1K0
如何处理 MySQL错误码 1215:无法添加外键约束?
本文介绍如何利用Python和Pandas库实现数据预处理,包括数据清洗、转换、分析和可视化等操作。
王翔
2017/06/19
21.6K0
MySQL外键约束
关系键是关系数据库的重要组成部分。关系键是一个表中的一个或几个属性,用来标识该表的每一行或与另一个表产生联系。 其中就包括外键
JavaEdge
2022/11/29
6.6K0
MySQL外键约束
MySQL外键约束
外键其实很好理解,简单的说就是两张表建立一个连接关系。这里我们那主表A和副表B举例,我A表中有用户信息,B表中有用户订单信息。要是数据完整对应起来,肯定是需要把两张表关联起来,我们因此会在B表中村一个A表的字段,常见的我们存的是A表的主键ID外键。
兔云小新LM
2019/08/02
6K0
Mysql外键约束
如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表。外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松。外键主要用来保证数据的完整性和一致性 两个表必须是InnoDB表,MyISAM表暂时不支持外键 外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立; 外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如in
暖月寒星
2020/03/10
5.9K0
重温MySQL外键约束
1、父表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则父表与子表是同一个表,这样的表称为自参照表,这种结构称为自参照。 2、必须为父表定义主键。 3、主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。 4、外键中列的数目必须和父表的主键中列的数目相同。 5、外键中列的数据类型必须和父表主键中对应列的数据类型相同。说这么多比较笼统,还是看看例子吧。
AsiaYe
2019/11/06
6.4K0
MySQL外键约束使用
在MySQL中,外键约束用于确保两个表之间的数据一致性。外键约束是一种限制,它将一个表中的列与另一个表中的列相关联。具体来说,它要求在一个表中的某个列中的值必须在另一个表的某个列中存在。外键约束可以确保数据的完整性和一致性,防止数据被删除或修改时发生错误。
堕落飞鸟
2023/05/11
4.1K0
【MySQL】外键约束介绍
官方文档: https://dev.mysql.com/doc/refman/5.7/en/create-table-foreign-keys.html 1.外键作用: MySQL通过外键约束来保证表与表之间的数据的完整性和准确性。 2.外键的使用条件 1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持) 2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立; 3.外键关系的两个表的列必须
MySQL技术
2019/09/08
5.1K0
MySQL中创建外键的错误:1215 Cannot add the foreign key constraint[通俗易懂]
引言: MySQL中经常会需要创建父子表之间的约束,这个约束是需要建立在主外键基础之上的,这里解决了一个在创建主外键约束过程中碰到的一个问题。
全栈程序员站长
2022/07/11
2.5K0
MySQL中创建外键的错误:1215 Cannot add the foreign key constraint[通俗易懂]
mysql 取消外键约束_主键约束和外键约束什么意思
解决方法是在Mysql中取消外键约束: SET FOREIGN_KEY_CHECKS=0;
全栈程序员站长
2022/11/01
6.6K0
mysql 取消外键约束_主键约束和外键约束什么意思
外键约束
外键约束 foreign key 外键约束的要求: 父表和字表必须使用相同的存储引擎,禁止使用临时表; 数据库引擎只能是InnoDB; 外键列和参照列必须具有相似的数据类型,数字的长度或者是否有符号必须一样,字符长度可以不不一样; 外键列和参照列必须创建索引,参照列没有索引,mysql回自动创建索引; ----------- 下面创建两个数据表 1(父表)省份表两个字段 id (主键) 省份名称 2(子表)用户表三个字段 id (主键) 用户名称 省份编号(外键对应省表的主键id类型一样,因为需要把这个设
前朝楚水
2018/04/04
2K0
外键约束
     2.设置外键约束的两个表之间会有 父子关系 ,即字表中外键字段的取值范围 取决于 父表
全栈程序员站长
2022/09/06
1.7K0
mysql 设置外键约束(foreign key)
建立外键约束可以采用列级约束语法和表级约束语法,如果仅仅对单独的一个数据列建立外键约束,则使用列级约束语法即可;如果需要对多个列组合创建外键约束,或者需要为外键约束指定名字则必须使用表级约束语法。
全栈程序员站长
2022/06/25
5.4K0
MySQL数据库——外键约束
概述 外键约束确保数据的有效性。保证数据的一致性、完整性 外键只能引用外表中列的值 相关联字段中主键所在的表就是主表,外键所在的表就是从表 语法 在创建表时给字段设置外键 [CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,…] REFERENCES <主表名> 主键列1 [,主键列2,…] mysql>create table students (id int undesigned frimary key auto_increment not null, ->n
落雨
2022/03/07
34.2K0
【说站】mysql外键约束的理解
2、可以使用触发器来代替外键,对于相关数据的同时更新外键更合适,但是如果外键只是用作数值约束,那么触发器或者显式地限制取值会更好些(这里,可以直接使用ENUM类型)
很酷的站长
2022/11/23
4.7K0
【说站】mysql外键约束的理解
【说站】mysql外键约束的作用
1、外键约束是保证一个或两个表之间的参考完整性,外键是构建在一个表的两个字段或两个表的两个字段之间的参考关系。
很酷的站长
2022/11/24
4.6K0
【说站】mysql外键约束的作用
主、外键约束_创建主键约束
主键和外键是两种类型的约束; 1.主键是能唯一的标识表中的每一行,就是说这一列非空且值不重复,可以指定为主键;作用是用来强制约束表中的每一行数据的唯一性; 2.外键是b表中的某一列引用的值来源于a表中的主键列。也是约束b表中的外键列的值必须取致a表中的主键列值,不是其中的值就不能插入b表中。可以形成a表b表的联系,保持数据的约束和关联性。
全栈程序员站长
2022/11/03
2K0
三十四、外键约束
参照完整性要求关系中不允许引用不存在的实体。在 MySQL 中设置参照完整性的方式是使用 外键约束 。所谓外键就是用于在两个表中的数据之间建立和加强链接的一列或多列的组合,可控制可在外键表中存储的数据。例如,有学生表和分数表两个表,表内容如下。
喵叔
2021/06/29
1.9K0
【Java 进阶篇】MySQL外键约束详解
在数据库设计和管理中,外键约束是一项重要的功能,它用于维护表与表之间的关联关系,保证数据的完整性和一致性。本文将详细介绍MySQL外键约束的概念、用法以及一些最佳实践,以帮助您更好地理解和应用外键约束。
繁依Fanyi
2023/10/12
1K0
【Java 进阶篇】MySQL外键约束详解
【说站】mysql有哪些外键约束等级
当update/delete记录在主表上时,同步update/delete掉从表的匹配记录。
很酷的站长
2022/11/24
2.1K0
【说站】mysql有哪些外键约束等级

相似问题

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

10

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

1917

mysql错误1215(hy000)无法添加外键约束

10

MYSQL -错误1215 (HY000):无法添加外键约束

11

MySql给我:错误1215 (HY000):无法添加外键约束

113
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文