我有两个整数,它们是表中行的 ID。我想交换除 ID 之外的两行值。我想改变:
身份证 | A 栏 | B栏 | C栏 |
---|---|---|---|
5 | 343 | “ABC” | 空 |
13 | 90 | “防御” | “ZY” |
进入:
身份证 | A 栏 | B栏 | C栏 |
---|---|---|---|
5 | 90 | “防御” | “ZY” |
13 | 343 | “ABC” | 空 |
我该怎么做? ID 列不是
AUTOINCREMENT
,因此我无法插入具有任意 ID 的临时行。
您应该能够使用标准 SQL 来执行此操作:
update t
set id = (case when id = 5 then 13 else 5 end)
where id in (5, 13);
如果
id
列具有唯一约束,那么您可能会违反唯一约束。 如果发生这种情况,一种方法是两步法。 假设 id
始终为正:
update t
set id = (case when id = 5 then -13 else -5 end)
where id in (5, 13);
update t
set id = - id
where id < 0;
如果没有唯一约束或允许负值(情况可能并非如此),戈登的答案就有效。 如果存在仅强制执行正的、唯一值的约束,那么这两种解决方案都不起作用,特别是如果可以同时进行许多此类更新的话。 在这种情况下,我建议您使用临时表来存储正在交换的行的事务(为了一致性):
BEGIN;
CREATE TEMPORARY TABLE my_temp AS SELECT * FROM my_table WHERE id = 5;
DELETE FROM my_table WHERE id = 5;
UPDATE my_table SET id = 5 WHERE id = 13;
UPDATE my_temp SET id = 13 WHERE id = 5;
INSERT INTO my_table SELECT * FROM my_temp;
DROP TABLE my_temp;
COMMIT;
我没有评论所需的 50 声望,所以我需要发布作为答案。这是关于Hiko Haieto的回答。请注意,如果您的外键引用没有
ON DELETE CASCADE
约束,他的解决方案将不起作用 id
。
您将达到步骤
DELETE FROM my_table WHERE id = 5;
然后您将面临
foreign key constraint failed error
。
Gordon 的两步方法对我很有效,因为 SQLite 支持负主键
id
s。