MySQL创建外键错误150

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

这是我想用来设置数据库的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设置外键的最后一行,脚本将正常运行


尝试创建此外键时出错的原因是什么?

问题中的列
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