16 votes

sqlite ON CONFLICT différence entre ABORT et FAIL

De http://www.sqlite.org/lang_conflict.html

ABORTER Lorsqu'une violation de contrainte applicable se produit, l'algorithme de résolution ABORT interrompt l'instruction SQL actuelle avec une erreur SQLITE_CONSTRAIT et annule toutes les modifications apportées par l'instruction SQL actuelle ; mais les modifications apportées par des instructions SQL antérieures dans la même transaction sont préservées et la transaction reste active. Il s'agit du comportement par défaut et du comportement proscrit par la norme SQL.

FAIL Lorsqu'une violation de contrainte applicable se produit, l'algorithme de résolution FAIL interrompt l'instruction SQL en cours avec une erreur SQLITE_CONSTRAINT. Mais la résolution FAIL n'annule pas les modifications antérieures de l'instruction SQL qui a échoué et ne met pas fin à la transaction. Par exemple, si une instruction UPDATE rencontre une violation de contrainte sur la 100ème ligne qu'elle tente de mettre à jour, les modifications des 99 premières lignes sont préservées mais les modifications des lignes 100 et suivantes ne se produisent jamais.

Les deux préservent les modifications effectuées avant l'instruction qui a provoqué la violation de la contrainte et ne mettent pas fin à la transaction. Je suppose donc que la seule différence est que la résolution FAIL ne permet pas d'effectuer d'autres modifications, tandis que ABORT ne fait que sauvegarder la seule déclaration en conflit. Ai-je bien compris ?

19voto

Johannes Kuhn Points 5237

La réponse est simple : FAIL n'annule pas les changements effectués par l'instruction en cours.

Considérez ces 2 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);
INSERT INTO constABORT VALUES (1),(3),(4),(5);

La déclaration

UPDATE constABORT SET num=num+1 WHERE num<5

échouera et ne changera rien. Mais cet état

UPDATE constFAIL SET num=num+1 WHERE num<5

mettra à jour la première ligne, puis échouera et laissera la première ligne mise à jour, de sorte que les nouvelles valeurs sont 2, 3, 4, 5.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X