一尘不染

SQLite使用周期重新编号ID

sql

您好,我有很多插入行的表。我需要按编号对所有行进行重新编号并对其进行排序。

我找到了此代码,但对我不起作用。

SET @i = 100;
UPDATE "main"."Categories" SET ID = (@i := @i +1) WHERE "Name" = "White";
ALTER TABLE "main"."Categories" AUTO_INCREMENT = 1

因此,使用上述代码,我希望对所有具有名称的记录重新编号-
白色,并从100开始以增量1插入它们。但这对我不起作用。也许我的代码有问题,但是SQL和SQLite查询之间有区别。

这是我创建表格的方式:

CREATE TABLE Categories (id INTEGER PRIMARY KEY, Name TEXT, Free NUMERIC)

我希望已经有了解决方案,因为我不想手动进行:)


阅读 271

收藏
2021-03-08

共1个答案

一尘不染

该代码不是标准的SQL。

SQLite没有许多编程结构,因为它被设计为嵌入式数据库,在该数据库中使用宿主语言编写逻辑更为自然。

如果要在SQL中执行此操作,请尝试以下操作:
首先,创建一个临时表,以便我们有一个可用于计数的自动增量列:

CREATE TEMPORARY TABLE new_ids(i INTEGER PRIMARY KEY, old_id INTEGER);

插入一个虚拟记录,以确保下一个新记录从处开始100,然后插入Categories要更改的表的所有ID :

INSERT INTO new_ids VALUES(99, NULL);
INSERT INTO new_ids SELECT NULL, id FROM "Categories" WHERE "Name" = 'White';
DELETE FROM new_ids WHERE i = 99;

然后,我们可以更改原始表中的所有这些ID:

UPDATE "Categories"
  SET id = (SELECT i FROM new_ids WHERE old_id = "Categories".id)
  WHERE id IN (SELECT old_id FROM new_ids);
DROP TABLE new_ids;
2021-03-08