← 返回错误码列表

MySQL错误码 1005 分析与解决方案

错误信息

Error 1005

无法创建表。检查表名是否正确,以及是否有足够的权限。

MySQL在尝试创建表时遇到问题,常见原因包括:

# 常见错误信息
ERROR 1005 (HY000): Can't create table 'database.table' (errno: 150)
# 或
ERROR 1005 (HY000): Can't create table (errno: 121)

解决方案

  • 检查外键约束是否正确(最常见原因)
  • 确认用户有创建表的权限
  • 验证表名是否符合命名规范
  • 检查引用的表是否存在
  • 确认数据类型和字符集匹配
  • 检查存储引擎是否支持外键

外键约束检查示例

# 检查外键约束问题
SHOW ENGINE INNODB STATUS;

# 查看最近的错误信息
SELECT * FROM information_schema.INNODB_SYS_FOREIGN
WHERE FOR_NAME = 'your_table_name';

# 检查表是否存在
SHOW TABLES LIKE 'referenced_table';

# 检查用户权限
SHOW GRANTS FOR current_user();

外键约束问题模拟

错误1005通常由外键约束问题引起:

创建父表

CREATE TABLE users (
  id INT PRIMARY KEY,
  name VARCHAR(50)
);

创建子表(失败)

CREATE TABLE orders (
  id INT PRIMARY KEY,
  user_id INT,
  FOREIGN KEY (user_id) REFERENCES users(id)
);

→ 错误:1005 如果users表不存在或字段不匹配

正确的创建顺序

1. 先创建父表 users

2. 再创建子表 orders

3. 确保数据类型完全匹配

常见原因与修复

1. 外键约束问题

  • 引用的表不存在
  • 引用的字段不存在
  • 数据类型不匹配
  • 字符集不匹配

2. 权限问题

  • 用户没有CREATE权限
  • 用户没有REFERENCES权限
  • 数据库权限不足

3. 表名问题

  • 表名包含非法字符
  • 表名与系统表冲突
  • 表名长度超限

4. 存储引擎问题

  • MyISAM不支持外键
  • 存储引擎配置错误

调试工具

使用以下MySQL命令诊断错误1005:

# 查看详细的错误信息
SHOW WARNINGS;

# 检查表状态
SHOW TABLE STATUS;

# 查看数据库权限
SELECT * FROM mysql.db WHERE Db = 'your_database';

# 检查字符集和排序规则
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

调试要点

数据类型匹配 确保外键字段类型完全一致

字符集一致 父表和子表字符集必须相同

存储引擎 必须使用InnoDB支持外键

权限检查 确认用户有足够的权限