Привет всем PostgreSQL / MySQL / SQLite экспертам и заранее благодарим за ваши мысли.
Рассмотрим следующий скрипт:
CREATE TABLE T (Col1 INT PRIMARY KEY);
INSERT INTO T VALUES (1), (2);
UPDATE T SET Col1 = Col1 + 1;
Выполнение его либо в PostgreSQL , MySQL, или SQLite приводит к ошибке нарушения первичного ключа.
Однако следующий код завершается успешно:
CREATE TABLE T (Col1 INT PRIMARY KEY);
INSERT INTO T VALUES (1), (2);
UPDATE T SET Col1 = Col1 - 1;
Oracle и SQL Сервер ведет себя как ожидалось, и одинаковые (эквивалентные Oracle) сценарии успешно выполняются и фиксируются без ошибок, как они должны ИМХО.
Кажется, что успех или неудача транзакции для PostgreSQL, MySQL и SQLite зависят от некоторый физический порядок обновления и ограничения проверяются для каждой строки перед завершением обновления. Насколько я понимаю, это нарушает фундаментальный принцип «все сразу».
Для меня это не имеет никакого смысла. Чего мне не хватает?
Будьте в безопасности и здоровы!