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