2011-11-04 43 views
0
CREATE TABLE titlexplan(
    id INTEGER NOT NULL, 
    title_id INTEGER NOT NULL , 
    plan_id INTEGER NOT NULL , 
    start_date DATETIME NOT NULL, 
    end_date DATETIME 
    CHECK (start_date < end_date), 
    PRIMARY KEY(id), 
    INDEX (title_id), 
    FOREIGN KEY (title_id) 
    REFERENCES title(id) 
    INDEX (plan_id), 
    FOREIGN KEY (plan_id) 
    REFERENCES plan(id)  
); 

這是我正在使用的代碼,並且出現語法錯誤:#​​1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INDEX (plan_id), FOREIGN KEY (plan_id) REFERENCES plan(id))' at line 10我應該索引一個外鍵?我應該使用這張表的主鍵嗎?

我試圖讓title_id和plan_id更新,當其他表中的相應ID更新時,我試圖跟蹤更改。

我一直無法找到一個明確的指導如何做到這一點,這些查詢部分工作,但不是全部。我不認爲我在這張表中需要一個主鍵,但是當我不使用主鍵時,我得到一個警告:「Warning, table contains no primary key」。所以,我只是添加了'id'列。不過,我並不認爲這是真正需要的。

請指教。

謝謝。

+0

你得到的錯誤是因爲mssing逗號:'參考資料標題(ID),' –

回答

1
CREATE TABLE titlexplan(
    id INTEGER NOT NULL, 
    title_id INTEGER NOT NULL , 
    plan_id INTEGER NOT NULL , 
    start_date DATETIME NOT NULL, 
    end_date DATETIME 
    CHECK (start_date < end_date), 
    PRIMARY KEY(id), 

    FOREIGN KEY (title_id) 
    REFERENCES title(id) 
    ON UPDATE CASCADE, 

    FOREIGN KEY (plan_id) 
    REFERENCES plan(id) 
    ON UPDATE CASCADE 
); 

我相信這應該工作。 「ON UPDATE CASCADE」會導致這些外鍵隨時更新它們引用的更新密鑰。

另外請確保您使用innoDB引擎的外鍵正常工作。

如果你不想id列和title_id上​​的組合和plan_id的數據類型總是獨一無二的,你可以做

CREATE TABLE titlexplan(
    title_id INTEGER NOT NULL , 
    plan_id INTEGER NOT NULL , 
    start_date DATETIME NOT NULL, 
    end_date DATETIME 
    CHECK (start_date < end_date), 
    PRIMARY KEY(title_id, plan_id), 

    FOREIGN KEY (title_id) 
    REFERENCES title(id) 
    ON UPDATE CASCADE, 

    FOREIGN KEY (plan_id) 
    REFERENCES plan(id) 
    ON UPDATE CASCADE 
); 
+0

你爲什麼要把他們兩個主ID在第二個例子中,克萊? –

+0

另外,我可以證實這個作品。 –

+1

我這樣做,這樣你就不必創建一個額外的列'ID'作爲主鍵。相反,如果title_id和plan_id的組合可以代表組合的主鍵,那麼只要該組合將始終是唯一的 –

1

克萊展示瞭如何做級聯,所以我只想補充一點:

在外鍵上創建索引通常是一個好主意。如果你正在做一個級聯,你真的應該。

我不認爲在標準SQL中有任何方法可以創建索引作爲CREATE TABLE的一部分。 (MYSQL可能有一個擴展來做到這一點 - 我承認我沒有檢查。)所以你應該單獨創建索引。

create index idx_titlexplan_title on titlexplan (title_id); 
create index idx_titlexplan_plan on titlexplan (plan_id); 
+0

謝謝。請問爲什麼這是一個好主意? –

+0

另外,這是什麼樣的命名約定呢? 'idx_titlexplain_title'似乎是一個索引非常尷尬的名字。 heh –

+0

我注意到,如果我不這樣寫,它就不起作用。我明白你是怎麼做到的。 –

2

你得到,因爲缺少逗號的錯誤:

... 
    INDEX (title_id), 
    FOREIGN KEY (title_id) 
    REFERENCES title(id) ,  --- <---- missing comma here 
    INDEX (plan_id), 
    FOREIGN KEY (plan_id) 
    REFERENCES plan(id) 
); 

另一件事是CHECK約束你:

CHECK (start_date < end_date), 

這將產生任何錯誤,但SQL引擎將不要檢查那個約束。作爲MySQL的文檔中CREATE TABLE, CHECK constraints解釋:

The CHECK clause is parsed but ignored by all storage engines.

相關問題