我想更新数据库的架构。我复制了自动生成的脚本,但每个表脚本之后的最后一行是:
UPDATE "main"."sqlite_sequence" SET seq = 8 WHERE name = 'table';
sec
值对于我安装的数据库确实是正确的,但在其他安装上可能会有所不同。那么,将它设置为0是安全的,还是应该从每个安装的表中选择它?或者我可以跳过这一行并在没有它的情况下运行脚本吗?
答案 0 :(得分:1)
如果通过“自动生成”脚本表示数据库的完整.dump
,那么它将包含create table
语句和insert
语句,因此您可能希望update
将被执行。
如果修改自动生成的脚本,那么显然可以根据需要更改seq值。
以下是documentation所说的内容:
SQLite跟踪表所持有的最大ROWID 使用特殊的SQLITE_SEQUENCE表。 SQLITE_SEQUENCE表是 每当普通表时自动创建和初始化 包含一个AUTOINCREMENT列。的内容 可以使用普通的UPDATE,INSERT修改SQLITE_SEQUENCE表, 和DELETE语句。但是对这个表进行修改会 可能扰乱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;