powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / UPDATE ... WHERE ctid = $1
6 сообщений из 6, страница 1 из 1
UPDATE ... WHERE ctid = $1
    #38785336
Фотография SmeL_md
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно делать так?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
query = 'SELECT ctid FROM my_table';
FOR r IN EXECUTE query LOOP
  ...
    EXECUTE 'UPDATE my_table SET field = $1 WHERE ctid = $2'
     USING 'bla bla',r.ctid;
  ...
END LOOP;

ctidThe physical location of the row version within its table. Note that although the ctid can be used to locate the row version very quickly, a row's ctid will change if it is updated or moved by VACUUM FULL. Therefore ctid is useless as a long-term row identifier. The OID, or even better a user-defined serial number, should be used to identify logical rows.Здравый смысл подсказывает добавь поле сериал в таблицу и используй его в WHERE.
Другими словами вопрос работая в транзакции можно использовать ctid строки для однократного обновления.
...
Рейтинг: 0 / 0
UPDATE ... WHERE ctid = $1
    #38785360
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SmeL_mdМожно делать так?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
query = 'SELECT ctid FROM my_table';
FOR r IN EXECUTE query LOOP
  ...
    EXECUTE 'UPDATE my_table SET field = $1 WHERE ctid = $2'
     USING 'bla bla',r.ctid;
  ...
END LOOP;

ctidThe physical location of the row version within its table. Note that although the ctid can be used to locate the row version very quickly, a row's ctid will change if it is updated or moved by VACUUM FULL. Therefore ctid is useless as a long-term row identifier. The OID, or even better a user-defined serial number, should be used to identify logical rows.Здравый смысл подсказывает добавь поле сериал в таблицу и используй его в WHERE.
Другими словами вопрос работая в транзакции можно использовать ctid строки для однократного обновления.

нет так делать нельзя и не надо...
если между query = 'SELECT ctid FROM my_table';
и
EXECUTE 'UPDATE my_table SET field = $1 WHERE ctid = $2'
USING 'bla bla',r.ctid;
кто то сделает update этой самой записи ctid у нее изменится (в части случаев).
...
Рейтинг: 0 / 0
UPDATE ... WHERE ctid = $1
    #38785649
Лопата
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukSmeL_mdМожно делать так?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
query = 'SELECT ctid FROM my_table FOR UPDATE ';
FOR r IN EXECUTE query LOOP
  ...
    EXECUTE 'UPDATE my_table SET field = $1 WHERE ctid = $2'
     USING 'bla bla',r.ctid;
  ...
END LOOP;

пропущено...
Здравый смысл подсказывает добавь поле сериал в таблицу и используй его в WHERE.
Другими словами вопрос работая в транзакции можно использовать ctid строки для однократного обновления.

нет так делать нельзя и не надо...
если между query = 'SELECT ctid FROM my_table >>>FOR UPDATE<<<';
и
EXECUTE 'UPDATE my_table SET field = $1 WHERE ctid = $2'
USING 'bla bla',r.ctid;
кто то сделает update этой самой записи ctid у нее изменится (в части случаев).а вот так -- должен обломаться.


// может быть автор именно этого и хочет -- запускает в параллель 10-к апдейтящих жобов, и не хочет ,чтобы они параллелились. а адвайзори-локами заморчиваться нет желания.
...
Рейтинг: 0 / 0
UPDATE ... WHERE ctid = $1
    #38786074
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SmeL_md,

в транзакции можно использовать ctid строки для однократного обновления
такие желания говорят, что не туда всё пошло в развитии системы.
зачем вам "однократное обновление"? что вы хотите сделать с данными? у вас проблема с ключами?

ctid вам еще и вакуум может поменять.

--
http://www.postgresql.org/docs/9.3/static/plpgsql-cursors.html
40.7.3.3. UPDATE/DELETE WHERE CURRENT OF
вот сюда еще гляньте
и "and it's best to use FOR UPDATE in the cursor"

хотя, оч вероятно (но в код лезть лень смотреть), оно внутри по ctid и работает)
...
Рейтинг: 0 / 0
UPDATE ... WHERE ctid = $1
    #38786089
Фотография SmeL_md
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Misha Tyurinзачем вам "однократное обновление"? что вы хотите сделать с данными? у вас проблема с ключами?Все очень просто, "захотели" чуть поменять условия игры во время игры.
Т.е. изначально хватало констрэйнов для идентификации строки во время апдэйта, но теперь эти значения опциональны. Услугами ctid так и не воспользовался.
Но возник вопрос можно ли использовать ctid, с оговоркой что все это происходит в одной транзакции выборка строк и их ctid и выбранные строки будут обновляться только один раз в рамках данной транзакции.

Коль начали про ctid я думаю возможна ситуация когда ctid для определенной строки со временем станет актуальный для другой, или предположение не верно.
...
Рейтинг: 0 / 0
UPDATE ... WHERE ctid = $1
    #38786096
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SmeL_md,

a row's ctid will change if it is updated

вам тогда надо select for share хотя бы.

но с вакуумом надо уточнять, но оч подозреваю, что он их не подвинет, если вы их "взяли" уже.

удаление дубликатов через ctid
http://blog.2ndquadrant.com/using_the_postgresql_system_co/
http://www.postgresonline.com/journal/archives/22-Deleting-Duplicate-Records-in-a-Table.html
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / UPDATE ... WHERE ctid = $1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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