这是我想用来设置数据库的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设置外键,则脚本将运行且没有错误。
我在尝试创建此外键时遇到的错误是什么?
答案 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
该型号符合我的个人喜好。你所拥有的当然是可行的。