Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
 неатомарность SQL оператора UPDATE ?  [new]
дураг с инецеативой
Guest
Пример:
CREATE  TABLE A_TEST (  A  INT NOT NULL UNIQUE);
INSERT INTO A_TEST VALUES(1);
INSERT INTO A_TEST VALUES(2);
INSERT INTO A_TEST VALUES(3);
Есть ли логичное обоснование, почему не работает следующий запрос:
UPDATE A_TEST SET A = A + 1
???

По ходу, для каждой обновляемой записи происходит проверка ограничений для таблицы, до того, как будут изменены остальные затронутые UPDATE'ом записи.
ИМХО, абсолютно алогичный подход, или это неприемлимо и в "чистой" РМД, или ткните мне носом в стандарты и мануалы, где такое поведение хотя бы оговаривается?
4 сен 05, 13:09    [1844294]     Ответить | Цитировать Сообщить модератору
 Re: неатомарность SQL оператора UPDATE ?  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
В Oracle прекрасно работает
4 сен 05, 13:31    [1844318]     Ответить | Цитировать Сообщить модератору
 Re: неатомарность SQL оператора UPDATE ?  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
SQL> create table abc(A number not null primary key);

Table created.

SQL> insert into abc(A)values(1);

1 row created.

SQL> insert into abc(A)values(2);

1 row created.

SQL> insert into abc(A)values(3);

1 row created.

SQL> update abc set A=A+1;

3 rows updated.

SQL> select * from ABC;

         A
----------
         2
         3
         4

Полезно в вопросе уточнять СУБД
4 сен 05, 13:34    [1844319]     Ответить | Цитировать Сообщить модератору
 Re: неатомарность SQL оператора UPDATE ?  [new]
дураг с инецеативой
Guest
Gluk (Kazan)
Полезно в вопросе уточнять СУБД

Нда...
Не работает : PostgreSQL 8, Firebird 1.5, FirstSQL/J, Rel.
в HSQLDB 1.8 сработала даже вот такая фигня:
 UPDATE A_TEST SET A = CASE WHEN A = 2 THEN 3 WHEN A = 3 THEN 2 ELSE A END;
Других БД под рукой пока нет :)
4 сен 05, 14:18    [1844355]     Ответить | Цитировать Сообщить модератору
 Re: неатомарность SQL оператора UPDATE ?  [new]
Абориген
Member

Откуда:
Сообщений: 355
В MSSQL нормально:
A
-----------
2
3
4
4 сен 05, 17:31    [1844481]     Ответить | Цитировать Сообщить модератору
 Re: неатомарность SQL оператора UPDATE ?  [new]
Lamer@fools.ua
Member

Откуда: Mississauga, Ontario, Canada
Сообщений: 544
дураг с инецеативой
Пример:
CREATE  TABLE A_TEST (  A  INT NOT NULL UNIQUE);
INSERT INTO A_TEST VALUES(1);
INSERT INTO A_TEST VALUES(2);
INSERT INTO A_TEST VALUES(3);
Есть ли логичное обоснование, почему не работает следующий запрос:
UPDATE A_TEST SET A = A + 1
???

По ходу, для каждой обновляемой записи происходит проверка ограничений для таблицы, до того, как будут изменены остальные затронутые UPDATE'ом записи.
ИМХО, абсолютно алогичный подход, или это неприемлимо и в "чистой" РМД, или ткните мне носом в стандарты и мануалы, где такое поведение хотя бы оговаривается?


А с чего Вы взяли, что записи будут обновляться в той же последовательности, в которой они были добавлены?
4 сен 05, 23:33    [1844762]     Ответить | Цитировать Сообщить модератору
 Re: неатомарность SQL оператора UPDATE ?  [new]
Lamer@fools.ua
Member

Откуда: Mississauga, Ontario, Canada
Сообщений: 544
Lamer@fools.ua
А с чего Вы взяли, что записи будут обновляться в той же последовательности, в которой они были добавлены?


Тьфу. Торможу. Сорри.
4 сен 05, 23:34    [1844765]     Ответить | Цитировать Сообщить модератору
 Re: неатомарность SQL оператора UPDATE ?  [new]
AI
Member

Откуда: Москва
Сообщений: 2817
Lamer@fools.ua
дураг с инецеативой
Пример:
CREATE  TABLE A_TEST (  A  INT NOT NULL UNIQUE);
INSERT INTO A_TEST VALUES(1);
INSERT INTO A_TEST VALUES(2);
INSERT INTO A_TEST VALUES(3);
Есть ли логичное обоснование, почему не работает следующий запрос:
UPDATE A_TEST SET A = A + 1
???

По ходу, для каждой обновляемой записи происходит проверка ограничений для таблицы, до того, как будут изменены остальные затронутые UPDATE'ом записи.
ИМХО, абсолютно алогичный подход, или это неприемлимо и в "чистой" РМД, или ткните мне носом в стандарты и мануалы, где такое поведение хотя бы оговаривается?


А с чего Вы взяли, что записи будут обновляться в той же последовательности, в которой они были добавлены?


Скорее, все проверки проходят, когда операция уже завершена. Например, из-за этого в оракле спокойно проходит каскадное обновление главных ключей с рекурсивными внешними (обновляется одна таблица), но не проходит обновление главных ключей, на которые ссылаются другие таблицы (можно, правда, обойтись триггерами). Оракл из-за такого поведения проверок может вообще отложить их (проверки) на момент commit.
5 сен 05, 09:36    [1845103]     Ответить | Цитировать Сообщить модератору
 Re: неатомарность SQL оператора UPDATE ?  [new]
Alexandr Kapustin
Member

Откуда: Москва
Сообщений: 71
Скажу за Sybase ASE. Думаю, что остальные СУБД, на которых это прокатывает, используют похожий механизм...

Для Sybase это называется deferred updates.
В этом случае update проходит в 3 стадии.
1. Отобрали записи, удовлетворяющие условиям в where, и поместили их в лог.
2. Физически удалили записи из таблицы
3. Вставили обновленные записи из лога в таблицу.

Так что проверки действительно происходят на последнем этапе, когда мы пачкой вставляем записи...

WBR, Alexandr
9 сен 05, 13:21    [1863046]     Ответить | Цитировать Сообщить модератору
 Re: неатомарность SQL оператора UPDATE ?  [new]
дураг с инецеативой
Guest
ну, еще один механизм - deferred unique constraints, использует индексы, допускающие наличие неуникальных ключей (Oracle)
9 сен 05, 13:41    [1863185]     Ответить | Цитировать Сообщить модератору
 Re: неатомарность SQL оператора UPDATE ?  [new]
gardenman
Member

Откуда: С-Петербург
Сообщений: 2347
connect to testdb user db2admin using         

   Database Connection Information

 Database server        = DB2/NT 8.2.2
 SQL authorization ID   = DB2ADMIN
 Local database alias   = TESTDB

create table testunique ( id int not null unique )
DB20000I  The SQL command completed successfully.

insert into testunique values (1),(2),(3)
DB20000I  The SQL command completed successfully.

commit
DB20000I  The SQL command completed successfully.

select * from testunique

ID         
-----------
          1
          2
          3

  3 record(s) selected.


update testunique set id=id+1
DB20000I  The SQL command completed successfully.

select * from testunique

ID         
-----------
          2
          3
          4

  3 record(s) selected.


commit
DB20000I  The SQL command completed successfully.

9 сен 05, 17:25    [1864533]     Ответить | Цитировать Сообщить модератору
 Re: неатомарность SQL оператора UPDATE ?  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
дураг с инецеативой
ну, еще один механизм - deferred unique constraints, использует индексы, допускающие наличие неуникальных ключей (Oracle)


Без надобности. В пределах одного оператора разруливается штатной версионнстью. Ограничения могут нарушаться в процессе выполнения оператора. Контролируются либо по завершении оператора, либо по завершении транзации (если проверка ограничений отложенная).
9 сен 05, 17:58    [1864752]     Ответить | Цитировать Сообщить модератору
Все форумы / Сравнение СУБД Ответить