2012-07-18 135 views
35

我在下面從http://www.sqlite.org/foreignkeys.html SQLite的文檔的說明但是我嘗試添加一個外鍵失敗。這裏是我的創建陳述:SQLite的外鍵

CREATE TABLE 
    checklist (
     _id INTEGER PRIMARY KEY AUTOINCREMENT, 
     checklist_title TEXT, 
     description TEXT, 
     created_on INTEGER, 
     modified_on INTEGER 
    ); 

CREATE TABLE 
    item (
     _id INTEGER PRIMARY KEY AUTOINCREMENT, 
     FOREIGN KEY(checklist_id) REFERENCES checklist(_id), 
     item_text TEXT, item_hint TEXT, 
     item_order INTEGER, 
     created_on INTEGER, 
     modified_on INTEGER 
    ); 

第一張桌子被罰款。第二條語句發生錯誤。我已經嘗試將兩個查詢包裝在一個事務中而沒有。這裏是錯誤:

外鍵定義中的未知列「checklist_id」(代碼1):,編譯時:CREATE TABLE item(_id INTEGER PRIMARY KEY AUTOINCREMENT,FOREIGN KEY(checklist_id)REFERENCES checklist(_id),item_text TEXT ,item_hint TEXT,item_order INTEGER,created_on INTEGER,modified_on整數)

回答

69

你還有你將它添加爲外鍵之前創建的列。

因此,這將是:

CREATE TABLE 
    checklist (
     _id INTEGER PRIMARY KEY AUTOINCREMENT, 
     checklist_title TEXT, 
     description TEXT, 
     created_on INTEGER, 
     modified_on INTEGER 
    ); 

CREATE TABLE 
    item (
     _id INTEGER PRIMARY KEY AUTOINCREMENT, 
     checklist_id INTEGER, 
     item_text TEXT, 
     item_hint TEXT, 
     item_order INTEGER, 
     created_on INTEGER, 
     modified_on INTEGER, 
     FOREIGN KEY(checklist_id) REFERENCES checklist(_id) 
    ); 
+0

Doh!謝謝大家! :-) – 2012-07-18 15:59:04

+8

實際上,這有一個問題...約束必須在所有字段被定義之後出現。所以外鍵行應該在modified_on之後。 (如果有人在2019年尋求幫助。你好,從過去!) – 2012-07-18 17:19:33

+0

我解決了這個問題。 @GeeksOnHugs,你應該能夠編輯你的問題的答案。有人必須批准編輯,但如果某人的回答出現錯誤,您可以在2019年爲那些人編輯它:) – Scen 2012-07-18 17:26:42

4

您需要包括列名與外國密鑰包裝之前,()。

CREATE TABLE 
    item (
     _id INTEGER PRIMARY KEY AUTOINCREMENT, 
     checklist_id INTEGER, 
     FOREIGN KEY(checklist_id) REFERENCES checklist(_id), 
     item_text TEXT, item_hint TEXT, 
     item_order INTEGER, 
     created_on INTEGER, 
     modified_on INTEGER 
    ); 
5

只要你在你的項目表中缺少checklist_id列。您需要先聲明它,然後才能將其設置爲FOREIGN KEY。您試圖在不存在的列上創建FK,這就是爲什麼它不起作用的原因。

所以,你需要補充一點:

checklist_id INTEGER, 
FOREIGN KEY(checklist_id) REFERENCES checklist(_id) 

現在它應該工作。

3

將FOREIGN KEY定義放在SQL語句的末尾