2012-04-18 107 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