The answer is simple: FAIL does not undo changes made by the current statement.
Consider two tables:
CREATE TABLE IF NOT EXISTS constFAIL (num UNIQUE ON CONFLICT FAIL); CREATE TABLE IF NOT EXISTS constABORT (num UNIQUE ON CONFLICT ABORT); INSERT INTO constFAIL VALUES (1),(3),(4),(5),(6),(7),(8),(9),(10); INSERT INTO constABORT VALUES (1),(3),(4),(5),(6),(7),(8),(9),(10);
Statement
UPDATE constABORT SET num=num+1 WHERE num<10
won't work and won't change anything. But this offer
UPDATE constFAIL SET num=num+1 WHERE num<10
will update the first line, then it will work and leave 1 line updated, so the new values will be 2, 3, 4, 5, 6, 7, 8, 9, 10
source share