[MySQL] - errno:150

本文详细介绍了在MySQL中遇到创建外键时报错150时可能遇到的问题及其解决办法,包括字段类型和大小不匹配、缺少索引、键名重复、表引擎限制、默认值设置不当、混合键独立索引缺失、ALTER语句语法错误、编码不一致等。提供了一步一步的排查和修正步骤。

来源:http://www.javaeye.com/topic/615260

 

当你试图在mysql中创建一个外键的时候,这个出错会经常发生,这是非常令人沮丧的。像这种不能创建一个.frm 文件的报错好像暗示着操作系统的文件的权限错误或者其它原因,但实际上,这些都不是的,事实上,这个mysql报错已经被报告是一个mysql本身的bug并出现在mysql 开发者列表当中很多年了,然而这似乎又是一种误导。

在很多实例中,这种错误的发生都是因为mysql一直以来都不能很好的支持的关系的问题, 更不幸的是它也并没有指明到底是哪一个问题会导致上面那种错误,下面我把导致这个可怕 的150错误的常见原因列出来了,并且我以可能性的大小作了排序

已知的原因:

1, 两个字段的类型或者大小不严格匹配,例如,如果一个是INT(10), 那么外键也必须设置成INT(10), 而不是 INT(11) 也不能是 TINYINT. 你得使用 SHOW 命令来查看字段的大小,因为一些查询浏览器有时候把 int(10) 和int(11) 都显示为integer。另外,你还必须确定两个字段是否一个为 SIGNED,而另一个又是UNSIGNED, 这两字段必须严格地一致匹配,更多关于signed 和 unsigned 的信息,请参阅:http://www.verysimple.com/blog/?p=57

2, 你试图引用的其中一个外键没有建立起索引,或者不是一个primary key , 如果其中一个不是primary key 的放,你必须为它创建一个索引。

3, 外键的名字是一个已经存在的一个键值了,这个时候,你应该检查你的数据库以确保外健名字是唯一的,或者你在键名后面加上几个随机的字符以测试是否是这个原因。

4, 其中一个或者两个表是MyISAM引擎的表,若想要使用外键约束,必须是InnoDB引擎,(实际上,如果两个表都是MyISAM 引擎的,这个错误根本不会发生,但也不会产生外键),你可以通过查询浏览器来设置表的引擎类型

5, 你可能设置了ON DELETE SET NULL, 但是相关的键的字段又设置成了NOTS NULL 值。你可能通过修改cascade 的属性值或者把字段属性设置成 allow null 来搞定这个bug.

6, 请确定你的Charset 和 Collate 选项在表级和字段级上的一致

7, 你可能设置为外键设置了一个默认值,如 default=0

8, 在这个关系里面,其中的一个字段是一个混合键值中的一个,它没有自己独立的索引,这时,你必须为它创建一个独立的索引。

9, ALTER 声明中有语法错误

10. 要连接的两个表的编码格式不同

普通文本型问题,直接回答如下: 你提供的 `application.yml` 文件内容基本完整,但存在 **关键缩进错误** 和 **配置冲突问题**,导致 Spring Boot 无法正确解析数据库和 MyBatis 配置。这正是你项目中出现以下问题的根本原因: > ``` > No MyBatis mapper was found... > ``` > ❌ 数据库未连接 > ❌ Mapper 未加载 > ❌ SQL 不打印 --- ### 🔍 核心问题分析 #### ❌ 1. `spring.datasource` 缩进错误(最严重) ```yaml spring: application: name: Backend_Shop # 数据库连接池 datasource: # ⚠️ 错误!这里多了一层缩进 url: jdbc:mysql://localhost:3306/vueshops?useSSL=false&serverTimezone=UTC username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource ``` 👉 **`datasource` 被错误地挂到了 `spring` 下级,但前面已经有 `application` 同级项**。 ✅ 正确结构应为: ```yaml spring: application: name: Backend_Shop datasource: url: ... username: ... driver-class-name: ... type: ... ``` ⚠️ 当前写法会导致: - `datasource` 配置不被识别 - 数据源未创建 - MyBatis 不激活 - 所有依赖数据的组件失效 --- #### ❌ 2. `type-aliases-package` 和 `configuration` 位置错误 ```yaml type-aliases-package: com.zjitc.backend_shop.pojo configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl ``` 这两项不属于 `spring:` 直接子项,而是属于 **`mybatis:` 模块**! 当前写法会让 Spring 忽略这些配置。 --- #### ✅ 3. 正确的 `mybatis` 块写法(这部分是对的) ```yaml mybatis: configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl mapper-locations: classpath:mapper/*.xml type-aliases-package: com.zjitc.backend_shop.pojo ``` ✅ 这部分语法和路径正确,只要上面的问题修复就能生效。 --- ### ✅ 修正后的 `application.yml`(推荐使用) ```yaml spring: application: name: Backend_Shop datasource: url: jdbc:mysql://localhost:3306/vueshops?useSSL=false&serverTimezone=Asia/Shanghai username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource server: port: 9090 servlet: context-path: / logging: level: root: INFO com.zjitc.backend_shop: DEBUG pattern: console: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n" file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n" file: name: logs/backend-shop.log mybatis: configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl mapper-locations: classpath:mapper/*.xml type-aliases-package: com.zjitc.backend_shop.pojo pagehelper: helperDialect: mysql reasonable: true supportMethodsArguments: true params: count=countSql springdoc: api-docs: enabled: true path: /v3/api-docs swagger-ui: enabled: true path: /swagger-ui.html ``` --- ### ✅ 修改要点总结 | 问题 | 修正方式 | |------|----------| | `datasource` 缩进错误 | 移到与 `application` 同级 | | `type-aliases-package` 写错位置 | 删除外层重复配置,保留 `mybatis:` 中的即可 | | `serverTimezone=UTC` | 建议改为 `Asia/Shanghai` 更符合国内环境 | | `springdoc.swagger-ui.path` | 补全为 `/swagger-ui.html`(不是 `.h`) | --- ### ✅ 修改后预期效果 重启项目你会看到: #### ✅ 新增日志输出: ``` Initializing DruidDataSource... [INFO] Found 1 mapper(s) under package com.zjitc.backend_shop.mapper ==> Preparing: SELECT * FROM admin WHERE username = ? ``` #### ✅ 访问接口不再报 500 - `/admin/login` 能正常查库 - 返回标准 JSON:`{ "errno": 0, "data": { "token": "xxx" } }` #### ✅ Swagger 可访问 - [http://localhost:9090/swagger-ui.html](http://localhost:9090/swagger-ui.html) --- ### ✅ 最终结论 | 问题 | 回答 | |------|------| | 配置文件对吗? | ❌ **不对**,有严重缩进错误 | | 为什么数据库没连上? | 因为 `spring.datasource` 未被识别 → 数据源未初始化 | | 为什么 Mapper 找不到? | 因为 MyBatis 没启动 → 扫描流程未触发 | | 怎么解决? | ✅ 修正 `application.yml` 缩进和层级关系 | > 💡 提示:YAML 对**缩进极其敏感**,必须用空格(不要用 Tab),建议使用 IDE 的 YAML 插件自动校验格式。 请立即按上述修正配置文件并重新运行项目,99% 的问题将迎刃而解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值