2014-10-10 84 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