编辑#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
答案 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
)吗?)