我正在使用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 ]
我的问题是否有任何解决方案
答案 0 :(得分:2)
默认情况下,表格的 rowid 不会使用 sqlite_sequence 表格。
仅当指定 rowid 的别名(使用column_name INTEGER PRIMARY KEY
或column_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,例如: -
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表的等价物,只是它不能命名为this,也不能以sqlite开头。 注意!这将是使用SQLite重置id的唯一持久方式,但可能是一场噩梦
在删除所有行之后,我希望在删除行
后重置rowid字段
不是....就好像这样有效地重置rowid(基本没有AUTOINCREMENT rowid是根据现有的rowid确定的,所以如果不存在那么rowid将是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;
结果表是: -
如果使用以下内容: -
DELETE from rowidtable
INSERT INTO rowidtable (NOM) VALUES('after mass delete');
然后结果表将是: -
答案 1 :(得分:1)
sqlite_sequence
表仅用于定义了INTEGER PRIMARY KEY AUTOINCREMENT
列的表。
如果您依赖于表中给定行的内部默认值rowid
,那么您应该为该表定义一个命名自动增量主键,然后您可以使用{{ 1}}表。
答案 2 :(得分:0)
感谢您的所有答案,我找到了我想要的东西,而且非常简单
DELETE FROM 'table_name' WHERE col='value';
REINDEX 'table_name';
这将重建指定的表索引,因此如果删除所有行,索引将重置为0,如果仍然是表中的行,则索引将被正确重新编号。