gpt4 book ai didi

mysql - 为什么我得到 "error code 1005 can t create c errno 150 mysql "?

转载 作者:行者123 更新时间:2023-11-29 13:02:02 26 4
gpt4 key购买 nike

编辑#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 和 SHOW CREATE TABLE 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

最佳答案

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

但是 OP CREATE TABLE 语句没有这个问题;它们使用 MyISAM 和 InnoDB 作为默认存储引擎。 (不确定是否有其他存储引擎,我们没有看到指定的存储引擎,我只是猜测默认是 InnoDB 或 MyISAM。)

SHOW VARIABLES LIKE 'default_storage_engine'

要对此进行调试,请尝试在没有外键约束定义的情况下运行create table c,并验证表是否已成功创建。 (长度修饰符值 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 中,并且定义匹配。 (是否有可能该列在表a<中被命名为id(而不是a_id)/?)

关于mysql - 为什么我得到 "error code 1005 can t create c errno 150 mysql "?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23204556/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com