(外键的添加删除修改问题)ERROR 1005 (HY000): Can't create table 'mydb.#sql-f58_12' (errno: 150)

本文详细解析了在MySQL数据库中遇到的外键添加、修改和删除的问题,包括外键加不上、修改不了及删除外键约束的常见错误及其解决办法。强调了字段类型一致性、索引要求、数据库引擎类型及正确识别外键名称的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题1:
ERROR 1005 (HY000): Can’t create table ‘mydb.#sql-f58_12’ (errno: 150)

数据库表中外键加不上?

以前给表中字段加外键,都是加的另一个表的主键,这次同学问我,给一个author表中的name加外键(user表中的username),username不是主键。
alter table author add foreign key(name) references user(username)
然后就是加不上。。。
在这里插入图片描述

  • 原因1
    user表中的username,要成为author中name的外键,username(不是主键)此字段必须加上索引
    alter table user add index(username)

  • 原因2
    username和name者两个字段的类型必须一致。

  • 原因3
    show create table author
    show create table user
    看一下者两个表的类型是否一致
    在这里插入图片描述

  • 原因4
    你的数据库引擎类型是MyISAM

    • 外键
      MyISAM:不支持
      InnoDB:支持
      在这里插入图片描述

修改不了外键?

是的,经过一番百度,外键好像是不能直接修改的。
我用小海豚改了外键约束,想加一个Cascade,级联删除和级联修改。
出现以下提示:
在这里插入图片描述
所以说删了重新建!


删除外键约束

alter table author drop foreign key 外键名
删除报错 Can’t create table ‘mysqltest.#sql-f58_3f’ (errno: 150)
Error on rename of ‘.\mysqltest\sc’ to ‘.\mysqltest#sql2-f58-3f’ (errno: 152)
这些问题在于把外键名字写错了,外键的名字不是字段名。

如果你添加外键的时候用的是:

//没有指定添加外键的名字,数据库会有默认名字author_ibfk_1
ALTER TABLE author ADD  FOREIGN KEY (NAME) REFERENCES USER(username)
//指定了添加的外键的名字为qwe,  constraint qwe
ALTER TABLE author ADD CONSTRAINT qwe FOREIGN KEY (NAME) REFERENCES USER(username)

所以删除外键的时候先看一下外键的名字是什么?
show create table author;
在这里插入图片描述

Query OK! 哈哈


问题2:
ERROR 1452 Cannot add or update a child row: a foreign key constraint fails (mysqltest.#sql-cb4_10, CONSTRAINT studentfore1 FOREIGN KEY (snum) REFERENCES user (snum) ON DELETE CASCADE ON UPDATE CASCADE)

想给student表添加个外键,但是报错,是因为添加外键后,要保证student表中的数据要在user表中存在,所以应该先删除student表中的数据。
在这里插入图片描述

谢谢!

<think>嗯,用户遇到了MySQL创建表时出现的错误1005errno 150,提示无法创建表。首先,我需要回忆一下这个错误的常见原因。根据引用[1]提到的,errno 150通常和约束有关。可能的情况包括字段类型不匹配,或者引用的表不存在,还有可能是字符集或存储引擎不一致。 接下来,我应该逐步分析可能的问题点。首先检查引用的父表是否存在,用户可能忘记先创建被引用的表了。然后,确认字段的数据类型是否完全一致,比如INT和BIGINT虽然都是整数,但类型不同会导致错误。此,字符集和排序规则也需要一致,比如父表是utf8mb4而子表是latin1的话,就会出问题。 另字段必须有索引。如果子表的字段没有创建索引,MySQL会报错。还需要注意名称是否唯一,重复的名称也可能导致问题。存储引擎方面,InnoDB支持,而MyISAM不支持,所以两个表都必须是InnoDB引擎。 用户提供的引用[5]提到,错误139与表的列数或数据类型有关,但这里的问题更可能是设置错误。解决方案应该包括检查这些方面,并给出具体的SQL示例,比如修改字段类型、确保父表存在、统一字符集等。最后,建议用户使用SHOW ENGINE INNODB STATUS来获取详细错误信息,帮助定位问题。</think>### MySQL错误1005(ERRNO 150)解决方案 #### 错误原因分析 该错误通常由约束问题引起,具体表现为以下五种情况: 1. **字段类型不匹配**:子表列与父表主列的数据类型必须完全相同。例如父表使用$INT(10)$,子表使用$BIGINT(20)$会报错 2. **引用对象不存在**:被引用的表或列尚未创建 3. **字符集/排序规则冲突**:两个表的字符集或排序规则设置不一致 4. **索引缺失**:字段建立索引 5. **存储引擎不支持**:使用MyISAM引擎的表无法建立约束[^1][^4] #### 解决步骤 1. **验证父表存在性** ```sql SHOW TABLES LIKE 'parent_table'; ``` 2. **检查字段一致性** ```sql SHOW CREATE TABLE parent_table; SHOW CREATE TABLE child_table; ``` 3. **强制统一字符集** ```sql ALTER TABLE child_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` 4. **添加必要索引** ```sql ALTER TABLE child_table ADD INDEX idx_fk_column (fk_column); ``` 5. **修改存储引擎** ```sql ALTER TABLE child_table ENGINE=InnoDB; ``` #### 调试技巧 执行命令获取详细错误定位: ```sql SHOW ENGINE INNODB STATUS; ``` 在输出结果中搜索"LATEST FOREIGN KEY ERROR"部分[^5] #### 典型修复示例 错误定义: ```sql CREATE TABLE parent ( id INT PRIMARY KEY ); CREATE TABLE child ( parent_id VARCHAR(20), FOREIGN KEY (parent_id) REFERENCES parent(id) -- 类型不匹配 ); ``` 修正方案: ```sql ALTER TABLE child MODIFY parent_id INT; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值