【问题标题】:Sqlite update and autoincrement valueSqlite 更新和自增值
【发布时间】:2012-04-30 00:16:26
【问题描述】:

我想更新数据库的架构。我已经复制了自动生成的脚本,但是每个表脚本之后的最后一行是这样的:

UPDATE "main"."sqlite_sequence" SET seq = 8 WHERE name = 'table';

sec 值对于我安装的数据库确实是正确的,但在其他安装中可能会有所不同。那么,将其设置为 0 是否安全,或者我应该从每个安装表中选择它?或者我可以跳过这一行并在没有它的情况下运行脚本吗?

【问题讨论】:

    标签: sqlite database-schema auto-increment


    【解决方案1】:

    如果“自动生成”脚本是指数据库的完整 .dump,那么它将包括 create table 语句和 insert 语句,因此您可能希望执行 update一起来。

    如果您修改该自动生成的脚本,那么您显然可以根据需要更改 seq 值。

    这是documentation 必须说的话:

    SQLite 跟踪表曾经拥有的最大 ROWID 使用特殊的 SQLITE_SEQUENCE 表。 SQLITE_SEQUENCE 表是 每当一个普通的表被自动创建和初始化 包含一个 AUTOINCREMENT 列被创建。的内容 SQLITE_SEQUENCE 表可以使用普通的 UPDATE、INSERT、 和 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;
    

    【讨论】:

    • 我在设计器中手动进行了修改,然后我复制了“SQL预览”中显示的代码。
    • 所以,我猜如果我不修改sql_sequence表,它应该包含正确的值,即和更新前一样,对吧?
    • 是的,如果您只是为给定的表运行所有插入,那么对seq 的更新应该对齐序列; OTOH应该首先有一个插入......你在sqlite_sequence中也有插入吗?
    • 是的,我有 INSERT 查询。我做了测试,一切正常。现在,我将尝试不更新序列。
    • 我添加到我的答案中;看看它是否有意义,是否与你正在做的事情保持一致。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 2011-06-01
    • 2013-04-18
    • 2012-01-05
    • 2020-06-09
    相关资源
    最近更新 更多