我想更新數據庫的架構。我抄自動生成的腳本,但每個表的腳本後,最後一行是這樣的:Sqlite更新和自動增量值
UPDATE "main"."sqlite_sequence" SET seq = 8 WHERE name = 'table';
的sec
值確實是我的安裝DB是正確的,但它可以在其他設備不同而不同。那麼,將它設置爲0還是安全的,還是應該從每個安裝表中選擇它?或者我可以跳過這一行並在沒有它的情況下運行腳本?
我想更新數據庫的架構。我抄自動生成的腳本,但每個表的腳本後,最後一行是這樣的:Sqlite更新和自動增量值
UPDATE "main"."sqlite_sequence" SET seq = 8 WHERE name = 'table';
的sec
值確實是我的安裝DB是正確的,但它可以在其他設備不同而不同。那麼,將它設置爲0還是安全的,還是應該從每個安裝表中選擇它?或者我可以跳過這一行並在沒有它的情況下運行腳本?
如果「自動生成」腳本,你的意思是你的數據庫的完整.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;
我在設計器中手動進行了修改,然後複製了「SQL預覽」中顯示的代碼。 – iCantSeeSharp 2012-04-18 14:51:09
所以,我猜如果我不修改sql_sequence表,它應該包含正確的值,這與更新之前是一樣的,對嗎? – iCantSeeSharp 2012-04-18 15:08:40
是的,如果你只是運行給定表的所有插入,那麼更新到'seq'應該對齊序列; OTOH首先應該是一個插入...你也有插入sqlite_sequence以及? – 2012-04-18 15:10:59