默认情况下,表将具有不使用 sqlite_sequence 表的 rowid。
只有当 rowid 的别名被指定(使用column_name INTEGER PRIMARY KEY 或column_name INTEGER PRIMARY KEY AUTOINCREMENT 定义)AND 时,别名的定义才包含可选的@ 987654328@ 关键字/短语,确定 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,例如:-
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 的别名,显然它们不依赖于不存在的 sqlite_sequence 表。
当然,您总是可以拥有自己的 sqlite_sequence 表,只是它不能命名为这个,也不能以 sqlite 开头。 注意!这将是使用 SQLite 重置 id 的唯一持久方法,但可能是一场噩梦
以上所有假设:-
我想在删除行后重置 rowid 字段
不是......在删除所有行之后,就好像在这种情况下,rowid 将被有效重置(基本上没有 AUTOINCREMENT rowid 是根据现有 rowid 的最高值确定的,因此,如果不存在,则 rowid 将为 1)。
注意!!
此答案不宽恕或推荐上述任何内容。
示例 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;
结果表是:-
- id 为 10 和 12 的行首先插入(空值(红色)表示其他值)
- ID 为 5 的行最初是 ID 为 123 的行
- ID 为 125、126 和 127 的行是使用通过子查询获得的 rowid 插入的,该子查询将当前最大 rowid 加 1 (即最后一次插入运行 3 次)。
示例 2
如果使用以下内容:-
DELETE from rowidtable
INSERT INTO rowidtable (NOM) VALUES('after mass delete');
那么结果表将是:-