【MySQL】ERROR 1005 (HY000): Can't create table' (errno: 150)

创建含有外键的表的时候遇到如下错误 

ERROR 1005 (HY000): Can't create table 'eidsvr.oplog' (errno: 150)

test@3302 12:02:22>CREATE TABLE biz(

    -> id INTEGER NOT NULL AUTO_INCREMENT, 

    -> buid VARCHAR(255), 

    -> appkey VARCHAR(255), 

    -> createtime DATETIME, 

    -> name VARCHAR(255), 

    -> seccode TEXT(2048), 

    -> externel1 INTEGER, 

    -> externel2 VARCHAR(255), 

    -> externel3 VARCHAR(255), 

    -> PRIMARY KEY (id)

    -> ) ENGINE=InnoDB  ROW_FORMAT=COMPRESSED  KEY_BLOCK_SIZE=8 DEFAULT CHARSET=utf8;

Query OK, 0 rows affected (0.02 sec)

test@3302 12:03:13>CREATE TABLE oplog (

    -> id INTEGER NOT NULL AUTO_INCREMENT, 

    -> eid VARCHAR(128), 

    -> optime DATETIME, 

    -> kp VARCHAR(128), 

    -> optype INTEGER, 

    -> appkey VARCHAR(255), 

    -> buid VARCHAR(255), 

    -> description VARCHAR(255), 

    -> externel1 INTEGER, 

    -> externel2 VARCHAR(255), 

    -> externel3 VARCHAR(255), 

    -> PRIMARY KEY (id), 

    -> FOREIGN KEY(appkey) REFERENCES biz(appkey)

    -> ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED  KEY_BLOCK_SIZE=8 DEFAULT CHARSET=utf8;

ERROR 1005 (HY000): Can't create table 'eidsvr.oplog' (errno: 150)

以下情况会导致上述问题

1、外键字段与要做外键校验的字段类型不匹配

2、MySQL支持外键约束,并提供与其它DB相同的功能,但表类型必须为 InnoDB,非InnoDB 存储引擎会导致报错。

3、建外键的表的那个列没有index。


针对本例,在父表上的appkey 上添加索引 解决该问题! 

eidsvr@3302 12:10:09>alter table biz add index idx_b_appkey(appkey);

Query OK, 0 rows affected (0.01 sec)

Records: 0  Duplicates: 0  Warnings: 0

eidsvr@3302 12:14:06>CREATE TABLE oplog (

    -> id INTEGER NOT NULL AUTO_INCREMENT, 

    -> eid VARCHAR(128), 

    -> optime DATETIME, 

    -> kp VARCHAR(128), 

    -> optype INTEGER, 

    -> appkey VARCHAR(255), 

    -> buid VARCHAR(255), 

    -> description VARCHAR(255), 

    -> externel1 INTEGER, 

    -> externel2 VARCHAR(255), 

    -> externel3 VARCHAR(255), 

    -> PRIMARY KEY (id), 

    -> FOREIGN KEY(appkey) REFERENCES biz(appkey)

    -> ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED  KEY_BLOCK_SIZE=8 DEFAULT CHARSET=utf8;

Query OK, 0 rows affected (0.00 sec)

MySQL官方提供的问题原因:

Cannot find an index in the referenced table where the referenced columns appear as the first columns, or column types in the table and the referenced table do not match for constraint.

不能在“被reference的表”即父表里找到包含“被reference字段”的索引,或者是两个关联字段类型不匹配!

时间: 2024-08-02 00:00:37

【MySQL】ERROR 1005 (HY000): Can't create table' (errno: 150)的相关文章

ERROR 1005 (HY000): Can't create table错误的解决

在使用MySQL的时候,在操作不当时,很容易出现 ERROR 1005 (HY000): Can't create table 这类错误.很多站长朋友可能需要排查很久才会找到问题的原因其实很简单,希望这篇文章可以对站长朋友以及Mysql初学者一点帮助. MYSQL官方提供的问题原因: 在信息中有一组[LATEST FOREIGN KEY ERROR]会有最近错误的详细描述和解决办法. Cannot find an index in the referenced table where the r

ERROR 1005 (HY000): Can't create table 'zcxt.tb_asset' (errno: 150)解决

环境 MySQL 5.1 + 命令行工具 问题 建表出现如下错误: ERROR 1005 (HY000): Can't create table 'zcxt.tb_asset' (errno: 150) 解决 1. 是否存 在SQL语法错误: 2. 外键引用的字段是否存在.

【MySQL】Linux下MySQL 5.5、5.6和5.7的RPM、二进制和源码安装

  [MySQL]Linux下MySQL 5.5.5.6和5.7的RPM.二进制和源码安装   1.1  BLOG文档结构图       1.2  前言部分 1.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① MySQL的二进制安装过程(重点) ② MySQL多实例管理(mysqld_multi) ③ MySQL的源码编译安装过程 ④ Linux的逻辑卷的使用 ⑤ 文件的MD5值 ⑥ 访问MySQL的几种客

【MySQL】MySQL的四种事务隔离级别

[MySQL]MySQL的四种事务隔离级别 本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样.也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位.  2.一致性(Consistency):事务开始前和结束后,数据库的完整性约束

【MySql】mysql 字段个数的限制

看到itpub 论坛上有关于mysql数据库表中字段个数的讨论 ,讨论mysql字段个数限制在2559个! 自己做了测试,个数对存储引擎不同而不同!innodb 创建到第1001个时会报  Can't create table 'yang.#sql-c6d_421' (errno: 139)的错误! 下面是测试过程~ mysql> select version(); +------------+ | version()  | +------------+ | 5.5.18-log | +----

mysql出现ERROR 1819 (HY000)的解决方法_Mysql

ERROR 1819 (HY000): Your password does not satisfy the current policy requirements,出现这个问题怎么办?不用着急,下面给出答案. 为了加强安全性,MySQL5.7为root用户随机生成了一个密码,在error log中,关于error log的位置,如果安装的是RPM包,则默认是/var/log/mysqld.log. 一般可通过log_error设置 mysql> select @@log_error; +---

【MySQL】Innodb 恢复工具介绍

      在和数据打交道的过程中,总会遇到误删除数据的情况,在没有备份和binlog的情况下,如何恢复呢?本文介绍一个工具Percona Data Recovery Tool for InnoDB  使用 该工具的 注意事项: 1 The tools work only for InnoDB/XtraDB tables, and will not work with MyISAM tables. Percona does have a preliminary set of tools for

【Mysql】—— 报错:Can't call commit when autocommit=true

java.sql.SQLException: Can't call commit when autocommit=true at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:934) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:931) at com.mysql.jdbc.ConnectionImpl.commit(ConnectionImpl.jav

【江湖救急】ERROR 2003 (HY000): Can't connect to MySQL server on '****.mysql.rds.aliyuncs.com' (110)

江湖救急!!!  如上标题  ERROR 2003 (HY000): Can't connect to MySQL server on '***.mysql.rds.aliyuncs.com' (110) 无法访问数据库了  链接总是timeOUT