删除行后重置rowid字段

时间:2018-02-17 14:52:20

标签: sqlite rowid

我正在使用sqlite数据库,我想在删除行后重置rowid字段。我的表没有主键或指定的Id,我只使用sqlite提供的默认rowid。

  NOM        TYPE     CL     VAL   SP        TP

 "test1"    "test1"  "1"    "1"  "test1"    "test1"
 "test2"    "test2"  "2"    "2"  "test2"    "test2"
 "test3"    "test3"  "3"    "3"  "test3"    "test3"

当我删除一行或多行时,我希望自动重置默认rowid,所以我已经阅读了一些答案,发现我们可以通过使用sql_sequence表来实现。

delete from sqlite_sequence where name='table_name'

问题是我在sqlite中找不到该表

[ no such table: sqlite_sequence ]

我的问题是否有任何解决方案

3 个答案:

答案 0 :(得分:2)

默认情况下,表格的 rowid 不会使用 sqlite_sequence 表格。

仅当指定 rowid 的别名(使用column_name INTEGER PRIMARY KEYcolumn_name INTEGER PRIMARY KEY AUTOINCREMENT定义) AND 时才会定义别名包含可选的AUTOINCREMENT关键字/短语,用于确定rowid的算法使用 sqlite_sequence 表来确保rowid大于上次使用的rowid(通常它会更大)

即使您使用了AUTOINCREMENT,因此存在sqlite_sequence表,并且您从sqlite_sequence表中删除了该表的行。这不会重置序列,因为我相信使用的算法使用表中最高的现有rowid和从sqlite_sequence表获得的值。 here's a post I made in realtion to this

使用rowid可能很少或没有理由,就好像它不是唯一标识行的方法。

但是,如果您真的想要管理rowid,那么您可以通过指定 rowid 列(注意到存在隐含的UNIQUE约束)来专门设置此值。

所以你可以使用: -

INSERT INTO yourtable (rowid, NOM, TYPE, CL, VAL, SP, TP) VALUES(123,'MyName','Testx', '123', '123', 'Testx', 'Testx');
  • rowid将设置为123

您还可以使用更新rowid,例如: -

UPDATE yourtable SET rowid = 5 WHERE rowid = 123;

- 将123的rowid更改为5 唯一约束允许

您可以使用以下方式获取最高的rowid: -

SELECT max(rowid) from yourtable;

你甚至可以使用: -

INSERT INTO yourtable (rowid, NOM, TYPE, CL, VAL, SP, TP) VALUES((SELECT max(rowid) from yourtable)+1,'MyName','maxx', '???', '???', 'Maxx', 'Maxx');
  • 插入下一个rowid序列。

注意上面的例子没有rowid的别名,显然它们不依赖于不存在的sqlite_sequence表。

当然你总是可以拥有自己的sqlite_sequence表的等价物,只是它不能命名为this,也不能以sqlite开头。 注意!这将是使用SQLite重置id的唯一持久方式,但可能是一场噩梦

以上所有假设: -

  

我希望在删除行

后重置rowid字段
删除所有行之后,

不是....就好像这样有效地重置rowid(基本没有AUTOINCREMENT rowid是根据现有的rowid确定的,所以如果不存在那么rowid将是1 )。

  • 见下面的例子2。

注意!!

此答案并非宽恕或推荐上述任何内容。

示例1

使用以下内容: -

CREATE TABLE IF NOT EXISTS rowidtable (NOM TEXT, TYPE TEXT, CL TEXT, VAL TEXT, SP TEXT, TP TEXT);
INSERT INTO rowidtable (rowid) VALUES(10);
INSERT INTO rowidtable (rowid) VALUES(12);
INSERT INTO rowidtable (rowid, NOM, TYPE, CL, VAL, SP, TP) VALUES(123,'MyName','Testx', '123', '123', 'Testx', 'Testx');
INSERT INTO rowidtable (NOM, TYPE, CL, VAL, SP, TP) VALUES('MyName','Testx', '123', '123', 'Testx', 'Testx');
UPDATE rowidtable SET rowid = 5 WHERE rowid = 123;
SELECT max(rowid) from rowidtable;
--// Following repteated 3 times (so rowid's 125,126 and 127 used respectively)
INSERT INTO rowidtable (rowid, NOM, TYPE, CL, VAL, SP, TP) VALUES((SELECT max(rowid) from rowidtable)+1,'MyName','maxx', '???', '???', 'Maxx', 'Maxx');
select rowid,* from rowidtable;

结果表是: -

enter image description here

  • 首先插入ID为 10 12 的行(其他值为空(红色))
  • ID为 5 的行最初是一行,内容为 123
  • 使用通过子查询获得的rowid插入ID为 125 126 127 的行,该子查询将最大当前rowid加1(即最后一次插入运行3次)。

示例2

如果使用以下内容: -

DELETE from rowidtable
INSERT INTO rowidtable (NOM) VALUES('after mass delete');

然后结果表将是: -

enter image description here

答案 1 :(得分:1)

sqlite_sequence表仅用于定义了INTEGER PRIMARY KEY AUTOINCREMENT列的表。

如果您依赖于表中给定行的内部默认值rowid,那么您应该为该表定义一个命名自动增量主键,然后您可以使用{{ 1}}表。

答案 2 :(得分:0)

感谢您的所有答案,我找到了我想要的东西,而且非常简单

DELETE FROM 'table_name' WHERE col='value';
REINDEX 'table_name';

这将重建指定的表索引,因此如果删除所有行,索引将重置为0,如果仍然是表中的行,则索引将被正确重新编号。