Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / массовый update / 6 сообщений из 6, страница 1 из 1
23.04.2005, 11:46
    #33031627
rassvet
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массовый update
добрый день
подскажите как решить проблему
мне нужно в таблице, в одной из ключевых колонок увеличить все значение на 2, когда делаю
update table set felds=fields+2
выдает duplicate key, что вообще то логично
я так понимаю надо на время выполнения запроса отключить котроль этот
как это можно сделать?
когда то давно видел на тут упоминание, но не могу найти :(
...
Рейтинг: 0 / 0
25.04.2005, 04:33
    #33032481
фффф
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массовый update
Это косяк древний. Если поискать , то это оправдывают тем, что отложенная проверка уникальности будет сильно тормозить. Там же несколько рецептов приводится (например упорядочить физически строки по убыванию ключевого поля, или ходить циклом в порядке убывания).
...
Рейтинг: 0 / 0
26.04.2005, 14:06
    #33035801
Funny_Falcon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массовый update
Проверенно: в Firebird те же грабли. И с INSERT ... SELECT (см. в Google по ссылке выше) тоже. Видимо в чем-то дизайн совпадает Ж-)
...
Рейтинг: 0 / 0
26.04.2005, 15:43
    #33036233
DkmS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массовый update
По идее, везде одинаково должно быть, во всех базах. Проход в порядке убывания должен спасать (если ещё кто-то не работает в базе, естественно).
...
Рейтинг: 0 / 0
26.04.2005, 16:49
    #33036486
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массовый update
ффффЭто косяк древний. Если поискать , то это оправдывают тем, что отложенная проверка уникальности будет сильно тормозить. Там же несколько рецептов приводится (например упорядочить физически строки по убыванию ключевого поля, или ходить циклом в порядке убывания).

отложенная праверка уникальнасти не праблема (с логической точки зрения). действительная логическая праблема - каскады (по вторичным), если они там будут (1 ->2, 2->3). Т.ч. это не косяк, или "не совсем касяк". Можно ли проблему каскда решить с помощью разделения "областей видимости" (т.е. чтобы каскады при отработке видели только записи до начала транзакции)? Наверное можно (не будет ли там, в такой логике, т.е., смежных проблем в сложных взаимных транзакциях?). Но не очевидно, что можно именно в постгресе.
...
Рейтинг: 0 / 0
27.04.2005, 03:46
    #33037287
фффф
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массовый update
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
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / массовый update / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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