gpt4 book ai didi

MySQL创建外键错误150

转载 作者:行者123 更新时间:2023-11-29 06:33:45 24 4
gpt4 key购买 nike

这是我想用来设置数据库的 sql 脚本。基本上我有一些人在做选择,比如测试/调查。我有一些关于每个人的信息(人表)和他们对每个问题的答案(问题表)。每个人将回答多个问题(因此问题表的主键是(id, qid)

这是我的问题。我想存储与每个问题关联的整数数组。所以我创建了第三个表,array,它的主键是 (id, qid, idx),其中 idx 是数组中值的索引。 id 和 qid 都应该在问题表中有一个对应的条目,所以我已经制作了这些外键,但是当我这样做时我得到了常见的 150 errno。我不确定为什么。

CREATE TABLE person (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
age INT,
income INT
);

CREATE TABLE questions (
id INT NOT NULL,
qid INT NOT NULL,
a INT,
b INT,
c INT,
PRIMARY KEY (id, qid),
FOREIGN KEY (id) REFERENCES person(id)
);

CREATE TABLE array (
id INT NOT NULL,
qid INT NOT NULL,
idx INT NOT NULL,
array_value INT NOT NULL,
PRIMARY KEY (id, qid, idx),
FOREIGN KEY (id) REFERENCES person(id),
FOREIGN KEY (qid) REFERENCES questions(qid)
);

这个脚本不起作用。如果您删除试图为 qid 设置外键的最后一行,脚本将运行而不会出错。

我在尝试创建这个外键时犯了什么错误?

最佳答案

快速修复是更改外键约束引用 questions 表的 PRIMARY KEY。由于 PRIMARY KEY 被定义为两列的组合,因此外键需要相同:

FOREIGN KEY (id,qid) REFERENCES questions(id,qid)

使用您的语法,错误是因为 questions 表没有以 qid 作为前导索引的索引。如果您在 questions 上添加了这样一个索引,那么您可以创建一个引用列 qid 的外键。 InnoDB 允许外键引用非唯一键,但是......你不想那样做。那是一个非标准的扩展。并且文档警告不要这样做。

正常模式是将 PRIMARY KEY(或 UNIQUE KEY)作为外键的目标,这就是外键定义(上面)所做的。


跟进

您的模型看起来不错。

但我个人的偏好是将单个列作为 question 表的 PRIMARY KEY。 (我还以单数形式命名所有表,以匹配开发人员将要为其类命名的内容。)

person
id (PK)

question
id (PK)
person_id (FK references person.id)

我不会将第三个表命名为“array”,我会给它一个不同的名称。我将其命名为这些整数值中的“一个”代表什么,但我不清楚这些整数值到底是什么。

score
id (PK)
question_id (FK references question.id)
idx
score_value

那个模型正好符合我个人的喜好。你所拥有的当然是可行的。

关于MySQL创建外键错误150,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26290022/

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