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

Small. Fast. Reliable.
Choose any three.
ON CONFLICT

conflict-clause:

ON CONFLICT ROLLBACK ABORT FAIL IGNORE REPLACE

ON CONFLICT это нестандартное расширение, определенное для SQLite, которое может появиться во многих других командах SQL. Этому дают его собственную секцию в этом документе, потому что это не часть стандартного SQL и поэтому не могло бы быть знакомо.

ON CONFLICT, описанный здесь, был частью SQLite еще до версии 3.0.0 (2004-06-18). Фраза "ON CONFLICT" также часть UPSERT, который является расширением INSERT, начиная с версии 3.24.0 (2018-06-04). Не путайте эти два отдельных использования "ON CONFLICT".

Синтаксис для ON CONFLICT показан выше для команды CREATE TABLE. Для INSERT и UPDATE ключевые слова "ON CONFLICT" заменяются "OR", чтобы синтаксис читался более естественно. Например, вместо "INSERT ON CONFLICT IGNORE" у нас есть "INSERT OR IGNORE". Изменение ключевых слов есть, но значение то же самое.

ON CONFLICT относится к ограничениям UNIQUE, NOT NULL, CHECK и PRIMARY KEY. Логика ON CONFLICT не относится к ограничениям FOREIGN KEY. Есть пять варниантов алгоритма разрешения конфликтов: ROLLBACK, ABORT, FAIL, IGNORE и REPLACE. Алгоритм разрешения конфликтов по умолчанию ABORT. Это то, что они имеют в виду:

ROLLBACK

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

ABORT

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

FAIL

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

Логика FAIL работает только на оганичениях уникальноасти, NOT NULL и CHECK. Ограничительное нарушение внешнего ключа вызывает ABORT.

IGNORE

Когда применимое ограничительное нарушение происходит, алгоритм резолюции IGNORE пропускает одну строку, которая содержит ограничительное нарушение и продолжает обрабатывать последующие строки SQL-оператора, как будто ничто не пошло не так, как надо. Другие строки прежде и после строки, которая содержала ограничительное нарушение, вставляются или обновляются как обычно. Никакая ошибка не возвращена для уникальности, NOT NULL и ошибок ограничения UNIQUE, когда алгоритм разрешения конфликтов IGNORE используется. Однако, алгоритм разрешения конфликтов IGNORE работает как ABORT на ошибках ограничений внешнего ключа.

REPLACE

Когда ограничительное нарушение UNIQUE или PRIMARY KEY происходит, алгоритм REPLACE удаляет существующие ранее строки, которые вызывают ограничительное нарушение до вставки или обновления текущей строки, и команда продолжает выполняться как обычно. Если ограничительное нарушение NOT NULL происходит, разрешение конфликтов REPLACE заменяет значение NULL значением по умолчанию для той колонки, или если у колонки нет значения по умолчанию, то алгоритм ABORT используется. Если происходит ограничение CHECK или foreign key, REPLACE работает как ABORT.

Когда стратегия разрешения конфликтов REPLACE удаляет строки, чтобы удовлетворить ограничение, работают триггеры delete если и только если включены рекурсивные триггеры.

update hook не вызван для строк, которые удалены стратегией разрешения конфликтов REPLACE. И при этом REPLACE не увеличивает счетчик изменений. Исключительные поведения, определенные в этом параграфе, могли бы измениться в будущем выпуске.

Алгоритм, определенный в пункте OR INSERT или UPDATE, отвергает любой алгоритм, определенный в CREATE TABLE. Если никакой алгоритм не определяется нигде, алгоритм ABORT используется.