mysql外键不正确

q3qa4bjr  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(399)

关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。

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 tableHoudini.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 因为某种原因不能使用

f45qwnt8

f45qwnt81#

可能两个键之间的数据类型不相同

DROP TABLE IF EXISTS stamp;
CREATE TABLE stamp (
  id INT NOT NULL,
  name VARCHAR(50) NOT NULL,
  group_id INT 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
);

如果使用int表示id,则应使用int表示组\u id

dzjeubhm

dzjeubhm2#

外键是的主键的成员 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 必须与引用的列的数据类型相同(不需要自动增量部分来匹配数据类型)。
因此,请更改您的创建表:

CREATE TABLE quest_award_item (
  quest_id BIGINT UNSIGNED NOT NULL,
  item_id INT NOT NULL,
  PRIMARY KEY (quest_id, item_id),
  CONSTRAINT quest_award_item_ibfk_1 FOREIGN KEY (quest_id) REFERENCES quest (id) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT quest_award_item_ibfk_2 FOREIGN KEY (item_id) REFERENCES item (id) ON DELETE CASCADE ON UPDATE CASCADE
);

另一种解决方案是修改 quest.id 成为一个 INT ,然后您原来的创建表任务\奖励\项目将工作。

ALTER TABLE quest MODIFY COLUMN id INT AUTO_INCREMENT;

但是如果表中已经有id值足够大的行 BIGINT UNSIGNED (即大于231-1),则不能这样做。

相关问题