为什么我得到“错误代码1005无法创建c errno 150 mysql”?

时间:2014-04-21 19:35:12

标签: mysql database

编辑#2: - 按照Spencer 7593的回答,即创建没有外键的表,然后使用alter table语句添加它们,表成功创建并添加了外键成功。

但现在我想知道为什么? 为什么在我们创建表然后使用alter table语句添加外键约束时有效,而不是在create table语句中执行所有操作时?


我在数据库中创建以下表格。前两个是成功创建的,但第三个是给出了这个错误。

我在数据库中检查了this answer中我能理解的点数。请告诉我我收到此错误的原因。

CREATE TABLE a (
    a_id INT(255) NOT NULL AUTO_INCREMENT,
    name VARCHAR(5000),
    code VARCHAR(5000),
    PRIMARY KEY (a_id)
);

CREATE TABLE b (
    b_id INT(255) NOT NULL AUTO_INCREMENT,
    b_name VARCHAR(5000),
    PRIMARY KEY (b_id)
);

CREATE TABLE c ( -- error code 1005 can t create c errno 150 mysql
    a_id INT(255), -- fk
    b_id INT(255), -- fk
    PRIMARY KEY (a_id, b_id),
    FOREIGN KEY (a_id)
        REFERENCES a (a_id),
    FOREIGN KEY (b_id)
        REFERENCES b(b_id)
);

编辑: -

我分别执行了这三个语句(将所有INT类型的大小更改为11后 - 感谢Michael Berkowski的评论),令我惊讶的是,它确实创建了表格,但是给了这个日志(如果我使用了正确的词):

3   4   01:03:49    CREATE TABLE a (
     a_id INT(11) NOT NULL AUTO_INCREMENT,
     name VARCHAR(5000),
     code VARCHAR(5000),
     PRIMARY KEY (a_id)
 )  0 row(s) affected   0.156 sec
3   5   01:03:54    CREATE TABLE b (
     b_id INT(11) NOT NULL AUTO_INCREMENT,
     b_name VARCHAR(5000),
     PRIMARY KEY (b_id)
 )  0 row(s) affected   0.234 sec
3   6   01:03:58    CREATE TABLE c ( -- error code 1005 can t create c errno 150 mysql
     a_id INT(11), -- fk
     b_id INT(11), -- fk
     PRIMARY KEY (a_id, b_id),
     FOREIGN KEY (a_id)
         REFERENCES a (a_id),
     FOREIGN KEY (b_id)
         REFERENCES b(b_id)
 )  0 row(s) affected   0.203 sec

这就是创建了所有三个表,但在创建第三个表时会返回错误。


编辑#3: -

从SHOW CREATE TABLE a输出,并显示创建表b: -

CREATE TABLE `a` (
   `a_id` int(11) NOT NULL AUTO_INCREMENT,
   `name` varchar(5000) DEFAULT NULL,
   `code` varchar(5000) DEFAULT NULL,
   PRIMARY KEY (`a_id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `b` (
   `b_id` int(11) NOT NULL AUTO_INCREMENT,
   `b_name` varchar(5000) DEFAULT NULL,
   PRIMARY KEY (`b_id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8

1 个答案:

答案 0 :(得分:1)

此错误的最常见原因是外键列定义与引用列的定义不匹配。出错的另一个原因是引用的列中不存在引用的列。

但OP CREATE TABLE陈述没有这个问题;那些与MyISAM和InnoDB一起使用的默认存储引擎。 (不确定任何其他存储引擎,我们没有看到指定的存储引擎,我只是猜测默认是InnoDB或MyISAM。)

SHOW VARIABLES LIKE 'default_storage_engine'

要对此进行调试,请尝试运行create table c WITHOUT外键约束定义,并验证表是否已成功创建。 (长度修饰符值255使我们感到奇怪。为什么不允许它默认为11?)

CREATE TABLE c 
( a_id  INT COMMENT 'FK ref a.a_id'
, b_id  INT COMMENT 'FK ref b.b_id'
, PRIMARY KEY (a_id, b_id)
);

然后尝试添加外键约束:

ALTER TABLE c ADD CONSTRAINT FK_c_a
FOREIGN KEY (a_id) REFERENCES a (a_id);

确保a_id中存在列a,并且该定义匹配。 (表id中的列可能名为 a_id (而不是 a )吗?)