You can use UPSERT[1] to force the order in which UPDATES are performed. CREATE TABLE t1(id INTEGER); INSERT INTO t1 VALUES (1), (2), (3); SELECT * FROM t1; -- id -- -- -- 1 -- 2 -- 3 INSERT INTO t1( rowid, id) SELECT rowid, id + 1 FROM t1 WHERE 1 -- Some kind of WHERE needed for UPSERT parsing ORDER BY id DESC -- INSERT and therefore also UPDATE order ON CONFLICT(rowid) DO UPDATE SET id = excluded.id; SELECT * FROM t1; -- id -- -- -- 2 -- 3 -- 4 [1] https://www.sqlite.org/lang_UPSERT.html