关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。
10个月前关门了。
改进这个问题
mysql(mariadb ver 15.1 distrib 10.1.44-mariadb,用于使用readline 5.2的debian linux gnu(x86_64))给了我这个错误: ERROR 1005 (HY000) at line 129: Can't create table
Houdini.
stamp(errno: 150 "Foreign key constraint is incorrectly formed")
尝试创建此表时:
DROP TABLE IF EXISTS stamp;
CREATE TABLE stamp (
id INT NOT NULL,
name VARCHAR(50) NOT NULL,
group_id SMALLINT NOT NULL,
member BOOLEAN NOT NULL DEFAULT FALSE,
rank SMALLINT NOT NULL DEFAULT 1,
description VARCHAR(255) NOT NULL DEFAULT '',
PRIMARY KEY(id),
CONSTRAINT stamp_ibfk_1 FOREIGN KEY (group_id) REFERENCES stamp_group (id) ON DELETE CASCADE ON UPDATE CASCADE
);
对此,正确的外键约束是什么?我想是吧 group_id
因为某种原因不能使用
2条答案
按热度按时间c7rzv4ha1#
可能两个键之间的数据类型不相同
如果使用int表示id,则应使用int表示组\u id
v9tzhpje2#
外键是的主键的成员
quest_award_item
表,所以它们必须与自己的数据类型相同,但这不是问题所在。您似乎认为它们必须具有与自己表的主键相同的数据类型,但实际上这不是必需的。要求外键列必须与它们引用的列具有相同的数据类型。
在这种情况下,
quest_award_item.quest_id
必须与相同的数据类型quest.id
.同样地,
quest_award_item.item_id
必须与相同的数据类型item.id
.您尚未显示
quest
或者item
表,所以我们只能猜测它们的数据类型。但其中一个可能具有不兼容的数据类型。请回复您的意见:
那我该怎么解决这个问题呢?
你在下面发表评论说
quest.id
列定义为SERIAL
,mysql翻译成BIGINT UNSIGNED AUTO_INCREMENT
.引用的外键列
quest.id
必须与引用的列的数据类型相同(不需要自动增量部分来匹配数据类型)。因此,请更改您的创建表:
另一种解决方案是修改
quest.id
成为一个INT
,然后您原来的创建表任务\奖励\项目将工作。但是如果表中已经有id值足够大的行
BIGINT UNSIGNED
(即大于231-1),则不能这样做。