powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / неатомарность SQL оператора UPDATE ?
12 сообщений из 12, страница 1 из 1
неатомарность SQL оператора UPDATE ?
    #33250290
Пример:
Код: plaintext
1.
2.
3.
4.
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 );
Есть ли логичное обоснование, почему не работает следующий запрос:
Код: plaintext
1.
UPDATE A_TEST SET A = A +  1 
???

По ходу, для каждой обновляемой записи происходит проверка ограничений для таблицы, до того , как будут изменены остальные затронутые UPDATE'ом записи.
ИМХО, абсолютно алогичный подход, или это неприемлимо и в "чистой" РМД, или ткните мне носом в стандарты и мануалы, где такое поведение хотя бы оговаривается?
...
Рейтинг: 0 / 0
неатомарность SQL оператора UPDATE ?
    #33250309
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Oracle прекрасно работает
...
Рейтинг: 0 / 0
неатомарность SQL оператора UPDATE ?
    #33250310
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
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 

Полезно в вопросе уточнять СУБД
...
Рейтинг: 0 / 0
неатомарность SQL оператора UPDATE ?
    #33250335
Gluk (Kazan)Полезно в вопросе уточнять СУБД
Нда...
Не работает : PostgreSQL 8, Firebird 1.5, FirstSQL/J, Rel.
в HSQLDB 1.8 сработала даже вот такая фигня:
Код: plaintext
1.
 UPDATE A_TEST SET A = CASE WHEN A =  2  THEN  3  WHEN A =  3  THEN  2  ELSE A END;
Других БД под рукой пока нет :)
...
Рейтинг: 0 / 0
неатомарность SQL оператора UPDATE ?
    #33250411
Абориген
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В MSSQL нормально:
A
-----------
2
3
4
...
Рейтинг: 0 / 0
неатомарность SQL оператора UPDATE ?
    #33250539
Фотография Lamer@fools.ua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дураг с инецеативойПример:
Код: plaintext
1.
2.
3.
4.
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 );
Есть ли логичное обоснование, почему не работает следующий запрос:
Код: plaintext
1.
UPDATE A_TEST SET A = A +  1 
???

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

А с чего Вы взяли, что записи будут обновляться в той же последовательности, в которой они были добавлены?
...
Рейтинг: 0 / 0
неатомарность SQL оператора UPDATE ?
    #33250541
Фотография Lamer@fools.ua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lamer@fools.uaА с чего Вы взяли, что записи будут обновляться в той же последовательности, в которой они были добавлены?

Тьфу. Торможу. Сорри.
...
Рейтинг: 0 / 0
неатомарность SQL оператора UPDATE ?
    #33250739
AI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lamer@fools.ua дураг с инецеативойПример:
Код: plaintext
1.
2.
3.
4.
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 );
Есть ли логичное обоснование, почему не работает следующий запрос:
Код: plaintext
1.
UPDATE A_TEST SET A = A +  1 
???

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

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

Скорее, все проверки проходят, когда операция уже завершена. Например, из-за этого в оракле спокойно проходит каскадное обновление главных ключей с рекурсивными внешними (обновляется одна таблица), но не проходит обновление главных ключей, на которые ссылаются другие таблицы (можно, правда, обойтись триггерами). Оракл из-за такого поведения проверок может вообще отложить их (проверки) на момент commit.
...
Рейтинг: 0 / 0
неатомарность SQL оператора UPDATE ?
    #33261171
Alexandr Kapustin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажу за Sybase ASE. Думаю, что остальные СУБД, на которых это прокатывает, используют похожий механизм...

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

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

WBR, Alexandr
...
Рейтинг: 0 / 0
неатомарность SQL оператора UPDATE ?
    #33261245
ну, еще один механизм - deferred unique constraints, использует индексы, допускающие наличие неуникальных ключей (Oracle)
...
Рейтинг: 0 / 0
неатомарность SQL оператора UPDATE ?
    #33261951
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
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.

...
Рейтинг: 0 / 0
неатомарность SQL оператора UPDATE ?
    #33262031
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дураг с инецеативойну, еще один механизм - deferred unique constraints, использует индексы, допускающие наличие неуникальных ключей (Oracle)

Без надобности. В пределах одного оператора разруливается штатной версионнстью. Ограничения могут нарушаться в процессе выполнения оператора. Контролируются либо по завершении оператора, либо по завершении транзации (если проверка ограничений отложенная).
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / неатомарность SQL оператора UPDATE ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]