MySQL创建外键错误150

时间:2014-10-10 00:20:34

标签: mysql sql foreign-keys

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

这是我的问题。我想存储与每个问题相关的整数数组。所以我创建了第三个数组表,其主键是(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设置外键,则脚本将运行且没有错误。

我在尝试创建此外键时遇到的错误是什么?

2 个答案:

答案 0 :(得分:1)

qid中的列questions没有保证唯一性。这是目标密钥的要求 一把外键。因此,target是主键或具有唯一约束。

你的意思是:

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

答案 1 :(得分:1)

快速解决方法是更改​​该外键约束引用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)

我不会命名第三个表&#34;数组&#34;,我给它一个不同的名字。我将其命名为&#34; one&#34;这些整数值表示,但我不清楚这些整数值究竟是什么。

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

该型号符合我的个人喜好。你所拥有的当然是可行的。