MySQL创建外键错误150
这是我想用来设置数据库的sql脚本。基本上我有人在做选择,比如测试/调查。我有一些关于每个人的信息(人表)和每个问题的答案(问题表)。每个人将回答多个问题(因此问题表的主键是MySQL创建外键错误150,mysql,sql,foreign-keys,Mysql,Sql,Foreign Keys,这是我想用来设置数据库的sql脚本。基本上我有人在做选择,比如测试/调查。我有一些关于每个人的信息(人表)和每个问题的答案(问题表)。每个人将回答多个问题(因此问题表的主键是(id,qid)) 这是我的问题。我想存储与每个问题相关联的整数数组。因此我创建了第三个表array,它的主键是(id,qid,idx),其中idx是数组中值的索引。id和qid都应该在问题表中有相应的条目,因此我创建了这些外键,但在执行此操作时,我得到了常见的150 errno。我不确定原因 CREATE TABLE pe
(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设置外键的最后一行,脚本将正常运行
尝试创建此外键时出错的原因是什么?表
问题中的列qid
不保证唯一性。这是目标键的要求
因此,目标要么是主键,要么具有唯一约束
你的意思可能是:
FOREIGN KEY (id, qid) REFERENCES person(id, qid)
快速修复方法是更改外键约束引用问题
表的主键。由于主键定义为两列的组合,因此外键需要相同:
FOREIGN KEY (id,qid) REFERENCES questions(id,qid)
根据您的语法,错误是因为questions
表没有以qid
作为前导索引的索引。如果您在questions
上添加了这样一个索引,那么您可以创建一个引用列qid
的外键。InnoDB允许非唯一键被for引用eign键,但是…你不想这样做。这是一个非标准的扩展。文档警告不要这样做
通常的模式是将主键(或唯一键)作为外键的目标,这就是外键定义(上文)所做的
跟进
你的模特看起来不错
但我个人的偏好是将一列作为问题
表的主键(我也用单数命名所有表,以匹配开发人员将要命名的类)
我不会将第三个表命名为“array”,我会给它一个不同的名称。我会将它命名为这些整数值中的“一”代表什么,但我不清楚这些整数值到底是什么
score
id (PK)
question_id (FK references question.id)
idx
score_value
该模型正好符合我的个人偏好。您拥有的当然是可行的。哦,好的,谢谢。在这种情况下,像我当前的案例一样,处理案例的标准方法是什么?在问题中引入一个arrayid字段,这将是唯一的,并且让数组表引用arrayid而不是qid?谢谢,这很有效,而且是w你的回答给我的印象是,我正在做的事情并不是处理我的情况的正确方法。有没有更好的方法来做我正在尝试做的事情?(即,将数组与表中的每个记录相关联。)在我看来,您所拥有的一切还可以;我个人的偏好是将一个列作为问题表的主键;但这是由希望DAO具有一致模式的开发人员提供的,他们希望使用单一值、本机数据类型;不希望对象(类)的额外复杂性以两个成员作为标识符。
score
id (PK)
question_id (FK references question.id)
idx
score_value