2012-05-17 35 views
2

根據SQLite docs,獲取自動增量列的唯一方法是在主鍵上。是否有可能(模擬?)AUTOINCREMENT對Sqlite中的compound-PK?

我需要一個複合主鍵,但我也需要自動遞增。有沒有辦法在SQLite中實現這兩個?

我的桌子的

相關部分,我將它寫在PostgreSQL的:

CREATE TABLE tstage (
    id     SERIAL NOT NULL, 
    node     INT REFERENCES nodes(id) NOT NULL, 
    PRIMARY KEY (id,node), 
    -- ... other columns 
); 

這樣做的理由要求是所有節點上的數據最終轉儲到一個集中的節點,其中,具有單柱PK ,會有碰撞。

回答

2

該文檔是正確的。 然而,有可能重新實現自動增量邏輯觸發:(或者使用一個共同的my_sequence表的表名,如果有多個表)

CREATE TABLE tstage (
    id INT, -- allow NULL to be handled by the trigger 
    node INT REFERENCES nodes(id) NOT NULL, 
    PRIMARY KEY (id, node) 
); 

CREATE TABLE tstage_sequence (
    seq INTEGER NOT NULL 
); 
INSERT INTO tstage_sequence VALUES(0); 

CREATE TRIGGER tstage_id_autoinc 
AFTER INSERT ON tstage 
FOR EACH ROW 
WHEN NEW.id IS NULL 
BEGIN 
    UPDATE tstage_sequence 
    SET seq = seq + 1; 

    UPDATE tstage 
    SET id = (SELECT seq 
       FROM tstage_sequence) 
    WHERE rowid = NEW.rowid; 
END; 

+0

'rowid's可以重複使用。 –

+0

如果有索引,'SELECT max(id)FROM t'非常有效。 –

+0

觸發器是否意味着事務,還是我需要在'UPDATE tstage_sequence ...'之前明確地開始一個事務以防止客戶端之間的競爭? – Flimzy

1

觸發的作品,但複雜。更簡單地說,你可以避免串行ID。一種方法,你可以使用GUID。不幸的是,我找不到讓SQLite默認生成GUID的方法,所以你必須在你的應用程序中生成它。也沒有GUID類型,但可以將其存儲爲字符串或a binary blob

或者,也許你的其他專欄中有些東西可以作爲合適的關鍵。如果您知道插入不會比您選擇的時間戳格式(SQLite offers several, see section 1.2)的分辨率更頻繁,那麼可能(node, timestamp_column)是一個很好的主鍵。

或者,您可以使用SQLite的AUTOINCREMENT,但set the starting number on each node通過sqlite_sequence表,使生成的連續劇不會發生衝突。由於rowid是SQLite是一個64位數字,您可以通過爲每個節點生成一個唯一的32位數字(IP地址是一個方便的,可能是唯一的32位數字)並將其左移32位,或等同地將其相乘它由4294967296.因此,64位rowid成爲有效的兩個連接的32位數,NODE_ID, RECORD_ID,保證不會發生衝突,除非一個節點生成超過40億條記錄。

+0

'(node,id)'本質上是一個GUID。我看到你在說什麼 - 將它們組合成一個單獨的數據庫字段,使用某種類型的位圖。 – Flimzy

1

......怎麼

的假設

  • 只需要獨特性PK,不連續的煩躁
  • 源表中有一個PK

一個創建中央臺額外的列,節點號...

CREATE TABLE tstage (
    node INTEGER NOT NULL, 
    id INTEGER NOT NULL, <<< or whatever the source table PK is 
    PRIMARY KEY (node, id) 
     : 
); 

當您彙總數據到中央節點,插入源節點到「節點」,並設置「身份證」源表的主鍵列值的數量...

INSERT INTO tstage (nodenumber, sourcetable_id, ...); 

有沒有必要在中心表上維護另一個自動增量列,因爲nodenumber + sourcetable_id將始終是唯一的。

相關問題