我有一张桌子,我存储图像,我想为每个图像分配一个连续的帧编号。当我将图像添加到数据库表时,很容易添加一个帧编号,该帧编号高于我插入的最后一个帧编号(因为我缓存了最后一个编号)。但是当我删除图像时,我想更新帧编号,以便帧编号中没有任何“漏洞”,而且我还没有找到一种方法可以在不进行N + 1查询的情况下执行此操作。
表结构是(简化):
id | filename | frame_number
---+-------------------+-------------
1 | image1.jpg | 0
2 | image2.jpg | 1
3 | another_image.jpg | 2
大多数搜索导致人们想要创建一个没有洞的新(自动增量)索引,并且人们说他们不应该这样做或者必须创建一个新表。
我正在使用python并使用peewee处理我的数据库,但这不应该有任何区别,因为我认为我想要做的事情可以在原始的sqlite查询中完成。
答案 0 :(得分:0)
我终于在这个问题的第二个答案的帮助下得到了它:How to fill in the "holes" in auto-incremenet fields?
CREATE TABLE NewIDs
(
sort_index INTEGER PRIMARY KEY AUTOINCREMENT,
id INT UNSIGNED
)
INSERT INTO NewIDs (id)
SELECT
id
FROM
image
ORDER BY
filename ASC
UPDATE image SET sort_index = (SELECT sort_index FROM NewIDs WHERE image.id = NewIDs.id)-1
DROP TABLE NewIDs