2011-05-27 142 views
15

我有一個表上的多個(複合)主鍵,其中一個將自動增量。不過,有趣的是,SQLite允許在關鍵字PRIMARY KEY之後使用AUTOINCREMENT關鍵字。在表上的SQLite多主鍵,其中之一是自動遞增

我的查詢是:

CREATE TABLE ticket (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    seat TEXT, payment INTEGER, 
    PRIMARY KEY (id, seat)) 

但錯誤的是table "ticket" has more than one primary key

其實我可以避免這個表的其他主鍵。但我正在編寫一個ORM框架(地獄是啊,我瘋了),並不想改變表的PRIMARY KEY約束生成的結構(因爲它允許在MySQL afaik中)。

你知道任何解決方案嗎?

+0

我想你的意思是「唯一」之後,而不是「剛」後說? – Michael 2014-04-09 16:53:42

回答

12

不,我不認爲這是可能的。

您可以創建一個UNIQUE INDEX基本上具有作爲主鍵相同的效果:

CREATE UNIQUE INDEX pk_index ON "table1"("field1","field2"); 

此外,我看不到你的模式的邏輯,那就是 - >列是否爲自動增量和你不打算手動篡改這些值,無論如何它都將是唯一的,所以它會創建一個簡單的簡短主鍵。爲什麼複合材料?不過,您可能有充分的理由對列組合做出另一個索引。

+0

假設我在表上有一個主鍵,我應該爲這個主鍵生成一個索引還是在內部生成? – 2011-05-27 16:12:15

+0

是的,關鍵是自動索引。關於爲什麼如此,請參閱此[簡短文字](http://developer.mimer.com/documentation/html_92/Mimer_SQL_Engine_DocSet/Basic_concepts4.html)。 – stefgosselin 2011-05-27 16:17:58

+0

+1爲自動增量位。事實上,如果它是自動增量的,它不需要在主鍵中添加另外的字段。 – MPelletier 2011-05-27 20:28:14

18

UNIQUE INDEX單獨與PRIMARY KEY沒有相同的效果。一個唯一的索引將允許NULL;主鍵約束不會。你最好宣佈這兩個約束。

CREATE TABLE ticket (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    seat TEXT NOT NULL, 
    payment INTEGER, 
    UNIQUE (id, seat)); 

你也應該好好想想你是否真的需要接受NULL付款。

+0

最好的解決方案解決了我的問題 – 2015-09-22 06:16:09

0

你也可以這樣寫:

CREATE TABLE ticket (
    id INTEGER PRIMARY, 
    seat TEXT, payment INTEGER, 
    PRIMARY KEY (id, seat)) 
+1

這種技術沒有奏效,因此我低估了它。 – 2013-06-23 04:55:59

+1

不回答問題,'id'字段不會自動遞增 – 2013-10-02 09:10:11

相關問題