在SQLite数据库中特定位置插入行

6
我在SQLite Manager中创建了一个数据库,但不小心忘记了添加一行。现在我想要手动在中间添加一行,并且该行下面的其余自增键应自动递增1。希望我的问题清晰明了。
谢谢。

你不需要关心键值,只需将行追加到末尾。你认为在你的情况下这很重要吗? - Olaf Dietsche
将位置x之后的行剪切到一个临时表中,然后插入您要放置在位置x的记录,最后将从临时表复制的数据复制回原表。或者更新(row_no=row_no+1)x位置之后的数据并插入一个值为x的行,并不要忘记为row_no字段创建聚集索引。 - user2889419
2个回答

6

您不需要关心键值,只需将行附加在末尾即可。

如果您确实需要这样做,您可以使用以下方式更新键。如果您想要在键87处插入新行

为键腾出空间

update mytable
set key = key + 1
where key >= 87

插入你的行。
insert into mytable ...

最后更新新行的键值

update mytable
set key = 87
where key = NEW_ROW_KEY

这个还能用吗?我收到了唯一约束失败的错误。我怀疑它取决于更新行的顺序,而这是任意的(根据SQLite文档)。 - bwt
@bwt 在key上设置唯一性约束似乎是可行的。因此,在这种情况下,您可以暂时删除约束(如果可能的话,我不确定),或将行移动到临时表中,然后再复制回来。 - Olaf Dietsche

6
我会只更新ID,递增它们,然后手动设置记录的ID:
CREATE TABLE cats (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  name VARCHAR
);
INSERT INTO cats (name) VALUES ('John');
INSERT INTO cats (name) VALUES ('Mark');
SELECT * FROM cats;

| 1 | John |
| 2 | Mark |

UPDATE cats SET ID = ID + 1 WHERE ID >= 2; -- "2" is the ID of forgotten record.
SELECT * FROM cats;

| 1 | John |
| 3 | Mark |

INSERT INTO cats (id, name) VALUES (2, 'SlowCat'); -- "2" is the ID of forgotten record.
SELECT * FROM cats;

| 1 | John    |
| 2 | SlowCat |
| 3 | Mark    |

下一条记录将使用自增功能插入,其ID将是倒数第二个(在我们的例子中为4)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接