2014-10-10 136 views
1

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

这是我的问题,我想存储一个与每个问题相关的整数数组,所以我创建了第三个表,数组,其主键是(id, qid, idx),其中idx是数组中值的索引,id和qid都应该在questions表中有对应的条目,所以我创建了这些外键,但是我得到了常见的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外键的最后一行,将运行该脚本withou t错误。

我试图创建这个外键时发生了什么错误?

回答

1

快速的解决办法是改变外键约束引用questions表的主键。由于主键是定义为两列的组合,外键将需要相同的:

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

随着你的语法,错误是因为questions表中没有的指数以qid为主导指数。如果您在questions上添加了这样的索引,则可以创建引用qid列的外键。 InnoDB允许一个外键引用非唯一键,但是......你不想这样做。这是一个非标准的扩展。文件警告它。

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


随访

你的模型看起来不错。

但我个人的偏好是将一列作为question表的主键。 (我也命名为单数的所有表,以匹配的开发商正打算来命名自己的类。)

person 
    id (PK) 

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

我不会名称第三表“阵列”,我给它一个不同的名称。我将它命名为这些整数值所代表的“一”,但我不清楚这些整数值究竟是什么。

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

该模型只适合我的个人喜好。你有什么是肯定可行的。

+0

从我+1 ...... – 2014-10-10 02:13:26

+0

谢谢,这是有效的,是我的目标。你的回答给我的印象是,我正在做的不是处理我的情况的正确方法。有没有更好的方式来做我想做的事情? (也就是将一个数组与一个表中的每个记录关联起来)。 – 2014-10-11 01:18:29

+0

你对我看起来没问题;我个人的偏好是将一列作为问题表的主键;但是那些开发人员需要一个一致的DAO模式,需要一个单一的值,本地数据类型;不想将具有两个成员的对象(类)的额外复杂性作为标识符。 – spencer7593 2014-10-11 05:37:59

1

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

你有没有可能意味着:

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

噢,好的,谢谢。在那种情况下,像我现在这样的情况下处理的标准方式是什么?在问题中引入一个arrayid字段,这将是唯一的,并让数组表引用arrayid而不是qid? – 2014-10-10 00:31:02