【问题标题】:SQLite: *prevent* PRIMARY KEY value from resetting after delete all rows [duplicate]SQLite:*防止* PRIMARY KEY 值在删除所有行后重置 [重复]
【发布时间】:2016-01-13 03:09:20
【问题描述】:

我有一个 SQLite 表,有几列,包括一个“ID”列,它是 INTEGER PRIMARY KEY。

当我插入时,这个值会按预期递增。

但是,当我删除所有行时,该列的值会在下一次插入时恢复为 1。

有没有办法让列值从删除前的最大值继续递增?

例如:

  • (空表)
  • 插入
  • 插入

(第 2 行的 ID 值为 2,下一个插入为 3)

  • 删除所有行
  • 插入

(最新行的 ID 值为 1,但我希望它为 3)

【问题讨论】:

    标签: sqlite auto-increment


    【解决方案1】:

    如果 AUTOINCREMENT 关键字出现在 INTEGER PRIMARY KEY 之后,则会更改自动 ROWID 分配算法,以防止在数据库的生命周期内重复使用 ROWID。换句话说,AUTOINCREMENT 的目的是防止重复使用以前删除的行中的 ROWID。

    https://www.sqlite.org/autoinc.html

    【讨论】:

    • 这似乎可以解决问题。我被该页面第 1 项上的“如果不是严格需要,应该避免。通常不需要”所推迟。
    【解决方案2】:

    您使用的是什么版本的 SQLite?我正在使用SQLite version 3.8.11.1。主键值未重置。

    创建表并插入一些数据

    sqlite> create table test (id integer primary key autoincrement, name varchar(20));
    sqlite> select * from test;
    sqlite> insert into test (name) values ('hello1');
    sqlite> insert into test (name) values ('hello2');
    sqlite> select * from test;
    id          name
    ----------  ----------
    1           hello1
    2           hello2
    sqlite> select * from sqlite_sequence;
    name        seq
    ----------  ----------
    test        2
    

    autoincrement 列中,sqlite 将序列信息保存在sqlite_sequence 内部表中,您也可以查询。

    删除数据。请注意,序列保持原样。

    sqlite> delete from test;
    sqlite> select * from sqlite_sequence;
    name        seq
    ----------  ----------
    test        2
    sqlite> select * from test;
    sqlite> insert into test (name) values ('world1');
    sqlite> insert into test (name) values ('world2');
    sqlite> select * from test;
    id          name
    ----------  ----------
    3           world1
    4           world2
    sqlite> select * from sqlite_sequence;
    name        seq
    ----------  ----------
    test        4
    

    基于此,序列号似乎在删除后保持原样。我正在使用autoincrement 关键字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-24
      • 2010-11-09
      • 2016-11-25
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      相关资源
      最近更新 更多