2012-04-18 127 views
0

我想更新數據庫的架構。我抄自動生成的腳本,但每個表的腳本後,最後一行是這樣的:Sqlite更新和自動增量值

UPDATE "main"."sqlite_sequence" SET seq = 8 WHERE name = 'table'; 

sec值確實是我的安裝DB是正確的,但它可以在其他設備不同而不同。那麼,將它設置爲0還是安全的,還是應該從每個安裝表中選擇它?或者我可以跳過這一行並在沒有它的情況下運行腳本?

回答

1

如果「自動生成」腳本,你的意思是你的數據庫的完整.dump,那麼它將包括create table陳述,以及insert語句,所以你可能希望update被一起執行。

如果修改該自動生成的腳本,那麼顯然可以根據需要更改seq值。

這裏是什麼documentation不得不說:

SQLite的跟蹤最大的ROWID的,使用特殊SQLITE_SEQUENCE表的表曾舉辦過 。 SQLITE_SEQUENCE表是 創建並自動初始化每當一個正常表 包含一個AUTOINCREMENT列創建。可以使用普通的UPDATE,INSERT, 和DELETE語句修改SQLITE_SEQUENCE表的內容。但對此表進行修改將會影響AUTOINCREMENT密鑰生成算法。確保 在進行此類更改之前,您知道自己在做什麼。

最後,你需要確保的是,SEQ值的最高值相匹配。這演示:

sqlite> create table foo (a INTEGER PRIMARY KEY AUTOINCREMENT, b text); 
sqlite> insert into foo values (NULL, 'blabla'); 
sqlite> select * from foo; 
1|blabla 
sqlite> .dump 
PRAGMA foreign_keys=OFF; 
BEGIN TRANSACTION; 
CREATE TABLE foo (a INTEGER PRIMARY KEY AUTOINCREMENT, b text); 
INSERT INTO "foo" VALUES(1,'blabla'); 
DELETE FROM sqlite_sequence; 
INSERT INTO "sqlite_sequence" VALUES('foo',1); 
COMMIT; 
+0

我在設計器中手動進行了修改,然後複製了「SQL預覽」中顯示的代碼。 – iCantSeeSharp 2012-04-18 14:51:09

+0

所以,我猜如果我不修改sql_sequence表,它應該包含正確的值,這與更新之前是一樣的,對嗎? – iCantSeeSharp 2012-04-18 15:08:40

+0

是的,如果你只是運行給定表的所有插入,那麼更新到'seq'應該對齊序列; OTOH首先應該是一個插入...你也有插入sqlite_sequence以及? – 2012-04-18 15:10:59