创建没有漏洞的{s 444数据库索引

时间:2016-05-20 12:08:02

标签: python sqlite peewee

我有一张桌子,我存储图像,我想为每个图像分配一个连续的帧编号。当我将图像添加到数据库表时,很容易添加一个帧编号,该帧编号高于我插入的最后一个帧编号(因为我缓存了最后一个编号)。但是当我删除图像时,我想更新帧编号,以便帧编号中没有任何“漏洞”,而且我还没有找到一种方法可以在不进行N + 1查询的情况下执行此操作。

表结构是(简化):

id | filename          | frame_number
---+-------------------+-------------
1  | image1.jpg        | 0
2  | image2.jpg        | 1
3  | another_image.jpg | 2

大多数搜索导致人们想要创建一个没有洞的新(自动增量)索引,并且人们说他们不应该这样做或者必须创建一个新表。

我正在使用python并使用peewee处理我的数据库,但这不应该有任何区别,因为我认为我想要做的事情可以在原始的sqlite查询中完成。

1 个答案:

答案 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