我想更新数据库的架构。我抄自动生成的脚本,但每个表的脚本后,最后一行是这样的: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