The ABORT and FAIL constraint conflict resolution algorithms in SQLite are very similar, as both:
- Abort with a
SQLITE_CONSTRAINTerror if a unique constraint violation occurs; - Keep the transaction active;
- Commit/persist changes made by prior statements within the same transaction.
However, they differ in terms of handling of changes made by the statement that caused the violation:
FAILpreserves the changes made by the statement that causes the violation;ABORTdiscards changes made by the statement that causes the violation.
Please note that FAIL on a foreign key constraint violation will cause an ABORT.
To demonstrate this, let's suppose you have a table of unique numbers with ON CONFLICT FAIL:
-- FAIL
CREATE TABLE `numbers` (
`num` UNIQUE ON CONFLICT FAIL
);
INSERT INTO `numbers` VALUES (1), (3), (4);
This will result in the following table of numbers:
+-----+ | num | +-----+ | 1 | | 3 | | 4 | +-----+
Suppose you run an UPDATE query, that causes a violation of the uniqueness constraint, for example, like the following:
UPDATE `numbers` SET `num` = `num` + 1 WHERE `num` <= 4 -- Error: UNIQUE constraint failed: a.num
This will fail with a SQLITE_CONSTRAINT error and update the first matching record, resulting in the following:
+-----+ | num | +-----+ | 2 | | 3 | | 4 | +-----+
Compare this to the same table of unique numbers, but with ON CONFLICT ABORT:
-- ABORT
CREATE TABLE `numbers` (
`num` UNIQUE ON CONFLICT ABORT
);
INSERT INTO `numbers` VALUES (1), (3), (4);
Running the same UPDATE query will fail with a SQLITE_CONSTRAINT error as well, but unlike FAIL, it will not persist changes for the record that violated the uniqueness constraint:
UPDATE `numbers` SET `num` = `num` + 1 WHERE `num` <= 4 -- Error: UNIQUE constraint failed: a.num
As a result, this query will update nothing in the table:
+-----+ | num | +-----+ | 1 | | 3 | | 4 | +-----+
This post was published by Daniyal Hamid. Daniyal currently works as the Head of Engineering in Germany and has 20+ years of experience in software engineering, design and marketing. Please show your love and support by sharing this post.