В большинстве баз данных SQL, если у вас есть огаринчение UNIQUE, NOT NULL или CHECK на таблице и вы пытаетесь сделать UPDATE или INSERT , который нарушает ограничение, база данных прервет происходящую операцию, отменит любые предшествующие изменения, связанные с тем же самым оператором UPDATE или INSERT, и возвратит ошибку. Это поведение по умолчанию SQLite, хотя SQLite также позволяет определять альтернативные пути к контакту с ограничительными нарушениями. Эта статья описывает те альтернативы и как использовать их.
SQLite определяет пять алгоритмов разрешения ограничительных конфликтов следующим образом:
Когда ограничительное нарушение происходит, непосредственный ROLLBACK происходит, таким образом заканчивая текущую транзакцию и аварийно прекращая работу команды с кодом возврата SQLITE_CONSTRAINT. Если никакая транзакция не активна (кроме подразумеваемой, которая создается по каждой команде), тогда этот алгоритм работы то же самое, как ABORT.
Когда ограничительное нарушение происходит, команда отменяет любые предшествующие изменения, которые это, возможно, внесло и аварийно прекращает работы с кодом возврата SQLITE_CONSTRAINT. Но никакой ROLLBACK не выполняется, так что изменения от предшествующих команд в той же самой транзакции сохранены. Это поведение по умолчанию для SQLite.
Когда ограничительное нарушение происходит, аварийно прекращает работу команды с кодом возврата SQLITE_CONSTRAINT. Но любые изменения базы данных, что команда сделала до столкновения с ограничительным нарушением, сохранены и не отменяются. Например, если UPDATE столкнулось с ограничительным нарушением на 100-й строке, которую оно пытается обновить, первые 99 изменений сохранены, но изменения строки 100 и далее никогда не происходят.
Когда ограничительное нарушение происходит, строка, которая содержит ограничительное нарушение, не вставляется или изменяется. Но команда продолжает выполняться как обычно. Другие строки прежде и после строки, которая содержала ограничительное нарушение, продолжают вставляться или обновляться как обычно. Никакая ошибка не возвращена.
Когда нарушение ограничения UNIQUE происходит, существующяя ранее строка, которая вызвала ограничительное нарушение, удалена до вставки или обновления текущей строки. Таким образом вставка или обновление всегда происходят. Команда продолжает выполняться как обычно. Никакая ошибка не возвращена.