RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Small. Fast. Reliable.
Choose any three.

Ограничительное разрешение конфликтов в SQLite

В большинстве баз данных SQL, если у вас есть огаринчение UNIQUE, NOT NULL или CHECK на таблице и вы пытаетесь сделать UPDATE или INSERT , который нарушает ограничение, база данных прервет происходящую операцию, отменит любые предшествующие изменения, связанные с тем же самым оператором UPDATE или INSERT, и возвратит ошибку. Это поведение по умолчанию SQLite, хотя SQLite также позволяет определять альтернативные пути к контакту с ограничительными нарушениями. Эта статья описывает те альтернативы и как использовать их.

Алгоритмы разрешения конфликтов

SQLite определяет пять алгоритмов разрешения ограничительных конфликтов следующим образом:

ROLLBACK

Когда ограничительное нарушение происходит, непосредственный ROLLBACK происходит, таким образом заканчивая текущую транзакцию и аварийно прекращая работу команды с кодом возврата SQLITE_CONSTRAINT. Если никакая транзакция не активна (кроме подразумеваемой, которая создается по каждой команде), тогда этот алгоритм работы то же самое, как ABORT.

ABORT

Когда ограничительное нарушение происходит, команда отменяет любые предшествующие изменения, которые это, возможно, внесло и аварийно прекращает работы с кодом возврата SQLITE_CONSTRAINT. Но никакой ROLLBACK не выполняется, так что изменения от предшествующих команд в той же самой транзакции сохранены. Это поведение по умолчанию для SQLite.

FAIL

Когда ограничительное нарушение происходит, аварийно прекращает работу команды с кодом возврата SQLITE_CONSTRAINT. Но любые изменения базы данных, что команда сделала до столкновения с ограничительным нарушением, сохранены и не отменяются. Например, если UPDATE столкнулось с ограничительным нарушением на 100-й строке, которую оно пытается обновить, первые 99 изменений сохранены, но изменения строки 100 и далее никогда не происходят.

IGNORE

Когда ограничительное нарушение происходит, строка, которая содержит ограничительное нарушение, не вставляется или изменяется. Но команда продолжает выполняться как обычно. Другие строки прежде и после строки, которая содержала ограничительное нарушение, продолжают вставляться или обновляться как обычно. Никакая ошибка не возвращена.

REPLACE

Когда нарушение ограничения UNIQUE происходит, существующяя ранее строка, которая вызвала ограничительное нарушение, удалена до вставки или обновления текущей строки. Таким образом вставка или обновление всегда происходят. Команда продолжает выполняться как обычно. Никакая ошибка не возвращена.