删除行后重置 rowid 字段
Reset rowid field after deleting rows
我正在使用 sqlite 数据库,我想在删除行后重置 rowid 字段。我的 table 没有主键或指定的 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 table 来做到这一点。
delete from sqlite_sequence where name='table_name'
问题是我在我的 sqlite
中找不到 table
[ no such table: sqlite_sequence ]
我的问题有什么解决办法吗
sqlite_sequence
table 仅用于定义了 INTEGER PRIMARY KEY AUTOINCREMENT
列的 table。
如果您依赖 table 中给定行的内部默认值 rowid
,那么您应该为该 table 定义一个命名的自动增量主键,然后您可以使用 sqlite_sequence
table.
重置计数器
A table 默认会有一个 rowid 不使用 sqlite_sequence table.
仅当指定 rowid 的别名时(使用 column_name INTEGER PRIMARY KEY
或 column_name INTEGER PRIMARY KEY AUTOINCREMENT
定义)AND 别名的定义包括可选的 AUTOINCREMENT
keyword/phrase,确定 rowid 的算法利用 sqlite_sequence table 以确保 rowid 大于上次使用的 rowid(通常无论如何都会更大)。
即使您使用了 AUTOINCREMENT
,因此 sqlite_sequence table 存在并且您从 sqlite_sequence [=146] 中删除了 table 的行=].这不会重置序列,因为我相信所使用的算法使用 table 中现有的最高 rowid 和从 sqlite_sequence table 中获得的值中的较高者。
可能很少或没有理由使用 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的别名,显然它们不依赖于non-existant sqlite_sequence table。
当然,您始终可以拥有自己的 sqlite_sequence table 等价物,只是不能将其命名为这个名称,也不能以 sqlite 开头。 注意!这将是使用 SQLite 重置 id 的唯一持久方法,但可能是一场噩梦
以上所有假设:-
and i want to reset rowid field after deleting rows
不是....在删除所有行之后,就好像是这种情况一样,rowid将被有效重置(基本上没有AUTOINCREMENT rowid被确定根据现有rowid的最高值,所以如果none存在则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;
结果table是:-
- 首先插入 ID 为 10 和 12 的行(其他值为空值(红色))
- id 为 5 的行最初是 id 为 123
的行
- ID 为 125、126 和 127 的行是使用获得的 rowid 插入的通过将 1 添加到最大当前 rowid 的子查询(即最后插入 运行 3 次)。
示例 2
如果使用以下内容:-
DELETE from rowidtable
INSERT INTO rowidtable (NOM) VALUES('after mass delete');
那么结果 table 将是:-
感谢您的所有回答,我找到了我要找的东西,而且非常简单
DELETE FROM 'table_name' WHERE col='value';
REINDEX 'table_name';
这将重建指定的 table 索引,因此如果所有行都被删除,索引将重置为 0,如果仍然是 table 中的行,则索引将被重新排序正确。
我正在使用 sqlite 数据库,我想在删除行后重置 rowid 字段。我的 table 没有主键或指定的 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 table 来做到这一点。
delete from sqlite_sequence where name='table_name'
问题是我在我的 sqlite
中找不到 table[ no such table: sqlite_sequence ]
我的问题有什么解决办法吗
sqlite_sequence
table 仅用于定义了 INTEGER PRIMARY KEY AUTOINCREMENT
列的 table。
如果您依赖 table 中给定行的内部默认值 rowid
,那么您应该为该 table 定义一个命名的自动增量主键,然后您可以使用 sqlite_sequence
table.
A table 默认会有一个 rowid 不使用 sqlite_sequence table.
仅当指定 rowid 的别名时(使用 column_name INTEGER PRIMARY KEY
或 column_name INTEGER PRIMARY KEY AUTOINCREMENT
定义)AND 别名的定义包括可选的 AUTOINCREMENT
keyword/phrase,确定 rowid 的算法利用 sqlite_sequence table 以确保 rowid 大于上次使用的 rowid(通常无论如何都会更大)。
即使您使用了 AUTOINCREMENT
,因此 sqlite_sequence table 存在并且您从 sqlite_sequence [=146] 中删除了 table 的行=].这不会重置序列,因为我相信所使用的算法使用 table 中现有的最高 rowid 和从 sqlite_sequence table 中获得的值中的较高者。
可能很少或没有理由使用 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的别名,显然它们不依赖于non-existant sqlite_sequence table。
当然,您始终可以拥有自己的 sqlite_sequence table 等价物,只是不能将其命名为这个名称,也不能以 sqlite 开头。 注意!这将是使用 SQLite 重置 id 的唯一持久方法,但可能是一场噩梦
以上所有假设:-
and i want to reset rowid field after deleting rows
不是....在删除所有行之后,就好像是这种情况一样,rowid将被有效重置(基本上没有AUTOINCREMENT rowid被确定根据现有rowid的最高值,所以如果none存在则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;
结果table是:-
- 首先插入 ID 为 10 和 12 的行(其他值为空值(红色))
- id 为 5 的行最初是 id 为 123 的行
- ID 为 125、126 和 127 的行是使用获得的 rowid 插入的通过将 1 添加到最大当前 rowid 的子查询(即最后插入 运行 3 次)。
示例 2
如果使用以下内容:-
DELETE from rowidtable
INSERT INTO rowidtable (NOM) VALUES('after mass delete');
那么结果 table 将是:-
感谢您的所有回答,我找到了我要找的东西,而且非常简单
DELETE FROM 'table_name' WHERE col='value';
REINDEX 'table_name';
这将重建指定的 table 索引,因此如果所有行都被删除,索引将重置为 0,如果仍然是 table 中的行,则索引将被重新排序正确。