powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / массовый update
6 сообщений из 6, страница 1 из 1
массовый update
    #33031627
rassvet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
добрый день
подскажите как решить проблему
мне нужно в таблице, в одной из ключевых колонок увеличить все значение на 2, когда делаю
update table set felds=fields+2
выдает duplicate key, что вообще то логично
я так понимаю надо на время выполнения запроса отключить котроль этот
как это можно сделать?
когда то давно видел на тут упоминание, но не могу найти :(
...
Рейтинг: 0 / 0
массовый update
    #33032481
фффф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это косяк древний. Если поискать , то это оправдывают тем, что отложенная проверка уникальности будет сильно тормозить. Там же несколько рецептов приводится (например упорядочить физически строки по убыванию ключевого поля, или ходить циклом в порядке убывания).
...
Рейтинг: 0 / 0
массовый update
    #33035801
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверенно: в Firebird те же грабли. И с INSERT ... SELECT (см. в Google по ссылке выше) тоже. Видимо в чем-то дизайн совпадает Ж-)
...
Рейтинг: 0 / 0
массовый update
    #33036233
DkmS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По идее, везде одинаково должно быть, во всех базах. Проход в порядке убывания должен спасать (если ещё кто-то не работает в базе, естественно).
...
Рейтинг: 0 / 0
массовый update
    #33036486
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ффффЭто косяк древний. Если поискать , то это оправдывают тем, что отложенная проверка уникальности будет сильно тормозить. Там же несколько рецептов приводится (например упорядочить физически строки по убыванию ключевого поля, или ходить циклом в порядке убывания).

отложенная праверка уникальнасти не праблема (с логической точки зрения). действительная логическая праблема - каскады (по вторичным), если они там будут (1 ->2, 2->3). Т.ч. это не косяк, или "не совсем касяк". Можно ли проблему каскда решить с помощью разделения "областей видимости" (т.е. чтобы каскады при отработке видели только записи до начала транзакции)? Наверное можно (не будет ли там, в такой логике, т.е., смежных проблем в сложных взаимных транзакциях?). Но не очевидно, что можно именно в постгресе.
...
Рейтинг: 0 / 0
массовый update
    #33037287
фффф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
4321
отложенная праверка уникальнасти не праблема (с логической точки зрения). действительная логическая праблема - каскады (по вторичным), если они там будут (1 ->2, 2->3). Т.ч. это не косяк, или "не совсем касяк".
Для суррогатного первичного ключа, который никогда не изменяется это как раз не проблема. А вот для unique constraint или уникального индекса - это актуально.
Я согласился бы что это не баг а фича, если бы от физического порядка строк (т.е. ctid) не зависело, пройдет update или нет.
Код: 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.
create temp table a5 (id int unique);
insert into a5 values( 1 );
insert into a5 values( 2 );
insert into a5 values( 3 );
select ctid, id from a5;
/*
ctid	id
(0,1)	1
(0,2)	2
(0,3)	3
*/
update a5 set id=id+ 1 ; --fail
create index a5_id_desc on a5((-id));
cluster a5_id_desc on a5;
select ctid, id from a5;
/*
ctid	id
(0,1)	3
(0,2)	2
(0,3)	1
*/
update a5 set id=id+ 1 ; --ok
select ctid, id from a5;
/*
ctid	id
(0,4)	4
(0,5)	3
(0,6)	2
*/
update a5 set id=id where id= 3 ;
select ctid, id from a5;
/*
ctid	id
(0,4)	4
(0,6)	2
(0,7)	3
*/
update a5 set id=id+ 1 ; --fail


А насчет того, что INSERT .. SELECT .. WHERE NOT EXISTS() обламывается если в другой сессии вставили запись - это для версионника как раз нормально.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / массовый update
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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