SQLite默认情况下不支持带有joins
的update
操作,但我们可以使用with-clause
+column-name-list
+select-stmt
来实现类似的功能。更多信息可参考https://www.sqlite.org/lang_update.html。
CREATE TABLE aa (
_id INTEGER PRIMARY KEY,
a1 INTEGER,
a2 INTEGER);
INSERT INTO aa VALUES (1,10,20);
INSERT INTO aa VALUES (2,-10,-20);
INSERT INTO aa VALUES (3,0,0);
WITH bb (_id,b1, b2)
AS (SELECT _id,a1+2, a2+1 FROM aa WHERE _id<=2)
UPDATE aa SET a1=(SELECT b1 FROM bb WHERE bb._id=aa._id),a2=(SELECT b2 FROM bb WHERE bb._id=aa._id)
WHERE _id in (SELECT _id from bb);
SELECT * FROM aa;
WITH bb (_id,b1, b2)
AS (SELECT _id,a1+2, a2+1 from aa WHERE _id<=2)
UPDATE aa SET (a1,a2)=(SELECT b1,b2 FROM bb WHERE bb._id=aa._id)
WHERE _id in (SELECT _id from bb);
SELECT * FROM aa;
UPDATE aa SET (a1,a2)=(SELECT bb.a1+2, bb.a2+1 FROM aa AS bb WHERE aa._id=bb._id)
WHERE _id<=2;
SELECT * FROM aa;
希望SQLite足够聪明,能根据文档查询增量。当使用一个select设置多个列(情况2和3)且没有有效ID(没有where _id in行)时,将会报错,不能使用ON IGNORE忽略,情况1将为所有ID> 2的行设置为null,这也是不好的。请注意保留HTML标记。