|
Обновить ТОЛЬКО ОДНУ запись
|
|||
---|---|---|---|
#18+
В таблице есть несколько записей с id=333. Необходимо обновить только одну из них. Как это сделать ? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2018, 08:17 |
|
Обновить ТОЛЬКО ОДНУ запись
|
|||
---|---|---|---|
#18+
PerederiyВ таблице есть несколько записей с id=333. Необходимо обновить только одну из них. Как это сделать ? Ну например select ctid, * from SOMETABLE where id=333; и далее обновляем через update SOMETABLE SET ... WHERE id=333 and ctid=(какой нить из полученных на предыдущем шаге); это если записи до байта совпадают (тоесть полные копии) иначе добавляем условие на какое то из полей еще которое у них разное вместо условия на ctid. -- Maxim Boguk dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2018, 09:24 |
|
Обновить ТОЛЬКО ОДНУ запись
|
|||
---|---|---|---|
#18+
если не важно какую из них - то так: Код: plsql 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2018, 09:37 |
|
Обновить ТОЛЬКО ОДНУ запись
|
|||
---|---|---|---|
#18+
Есть ещё один грязный способ. Добавить в таблицу поле с последовательностью по умолчанию. По этому полю ориентироваться. Грязный потому, что неоптимально для диска. Сильно неоптимально. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2018, 10:29 |
|
Обновить ТОЛЬКО ОДНУ запись
|
|||
---|---|---|---|
#18+
Alex URSесли не важно какую из них - то так: Код: plsql 1. 2. 3. 4. 5. 6.
Какой то бред вы написали... в таком виде оно вам вообще всю таблицу обновит. Откуда у вас идея что так можно делать? -- Maxim Boguk dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2018, 11:36 |
|
Обновить ТОЛЬКО ОДНУ запись
|
|||
---|---|---|---|
#18+
Alex URS, полагаю правильней так Код: sql 1. 2. 3. 4. 5. 6. 7.
иначе правда, обновит все ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2018, 14:39 |
|
Обновить ТОЛЬКО ОДНУ запись
|
|||
---|---|---|---|
#18+
gav21, а нет,лажа, лимит не работает :( ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2018, 14:43 |
|
Обновить ТОЛЬКО ОДНУ запись
|
|||
---|---|---|---|
#18+
Ещё можно использовать курсор: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Но, по-хорошему, первичные ключи должны быть на всех таблицах, тогда таких "проблем" не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2018, 21:58 |
|
Обновить ТОЛЬКО ОДНУ запись
|
|||
---|---|---|---|
#18+
Perederiy, оба ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2018, 23:45 |
|
Обновить ТОЛЬКО ОДНУ запись
|
|||
---|---|---|---|
#18+
Maxim BogukPerederiyВ таблице есть несколько записей с id=333. Необходимо обновить только одну из них. Как это сделать ? Ну например select ctid, * from SOMETABLE where id=333; и далее обновляем через update SOMETABLE SET ... WHERE id=333 and ctid=(какой нить из полученных на предыдущем шаге); это если записи до байта совпадают (тоесть полные копии) иначе добавляем условие на какое то из полей еще которое у них разное вместо условия на ctid. -- Maxim Boguk dataegret.ru при партицированной табличке не забыть про тейблоид. иначе получится "как всегда" ... |
|||
:
Нравится:
Не нравится:
|
|||
09.05.2018, 18:09 |
|
Обновить ТОЛЬКО ОДНУ запись
|
|||
---|---|---|---|
#18+
Maxim Boguk Какой то бред вы написали... в таком виде оно вам вообще всю таблицу обновит. Откуда у вас идея что так можно делать? мда, ошибся. вот так будет работать: Код: plsql 1. 2. 3. 4. 5. 6. 7.
Код: plsql 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2018, 09:04 |
|
Обновить ТОЛЬКО ОДНУ запись
|
|||
---|---|---|---|
#18+
Alex URS, Да елки же зеленые... И так тоже работать не будет... xmin легко может быть у всех строк в таблице одинаковым :) (а уж несколько записей с одинаковым xmin тем более нормально). Это очень странная идея что xmin - как то вам уникальную строку задаст (и вы даже не проверяете что у нее id=333 до кучи). -- Maxim Boguk dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2018, 09:41 |
|
Обновить ТОЛЬКО ОДНУ запись
|
|||
---|---|---|---|
#18+
Maxim BogukAlex URS, Да елки же зеленые... ну тогда так: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
oid уникален в пределах таблицы ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2018, 10:22 |
|
Обновить ТОЛЬКО ОДНУ запись
|
|||
---|---|---|---|
#18+
Alex URSMaxim BogukAlex URS, Да елки же зеленые... ну тогда так: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
oid уникален в пределах таблицы Еще интереснее... У 99.99% пользовательских таблиц в базе НЕТ колонки OID и никогда не будет. Он только у системных таблиц есть. PS: давайте вы всетаки изучите тему перед тем как советовать :). ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2018, 10:33 |
|
Обновить ТОЛЬКО ОДНУ запись
|
|||
---|---|---|---|
#18+
[quot Maxim Boguk]Alex URSпропущено... Еще интереснее... У 99.99% пользовательских таблиц в базе НЕТ колонки OID и никогда не будет. Он только у системных таблиц есть. PS: давайте вы всетаки изучите тему перед тем как советовать :). а это Вам ни о чём не говорит? Код: plsql 1.
предлагаю Вам изучить, что это значит ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2018, 10:35 |
|
Обновить ТОЛЬКО ОДНУ запись
|
|||
---|---|---|---|
#18+
[quot Alex URS]Maxim Bogukпропущено... а это Вам ни о чём не говорит? Код: plsql 1.
предлагаю Вам изучить, что это значит очередной . извините. наше вам здрасьте. не подскажете, с какого пж дефолтный with oids сменился на визаут ? и каковы причины отказа разработчиков от чемодана без ручки ? ещё раз -- есть системное поле цтид, которое внутри одной физической таблицы уникально -- т.к. состоит из номера блока и номера записи в блоке. Далее при доступе по нему нее требуется индекс -- т.к. оно и есть указатель и на блок и на запись. и более того -- это "поле" в записи "существует всегда" -- оно есть представление физического адреса. т.е. совет максима работает. неприятности начинаются когда вспоминают о партицировании -- там ключом записи (при доступе из головы наследования) будет оид-физич-партиции + цтид-внутри-оной. о чем при написании универсалий иногда забывают. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2018, 10:55 |
|
Обновить ТОЛЬКО ОДНУ запись
|
|||
---|---|---|---|
#18+
qwwq]пропущено... очередной . дефолтный with oids . он не WITH по дефолту. по умолчанию значение этого параметра — off (столбцы OID не добавляются); в PostgreSQL версии 8.0 и ранее он был включён (on). https://postgrespro.ru/docs/postgrespro/10/runtime-config-compatible#GUC-DEFAULT-WITH-OIDS В остальном Вы всё верно говорите, как и Maxim Boguk ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2018, 11:12 |
|
Обновить ТОЛЬКО ОДНУ запись
|
|||
---|---|---|---|
#18+
[quot Alex URS]Maxim Bogukпропущено... а это Вам ни о чём не говорит? Код: plsql 1.
предлагаю Вам изучить, что это значит Ага... полная перазапись условной 20Gb таблицы с полной блокировокой на это время... И неслабый overhead по записи в будущем в нее. С тем же успехом можно add id serial not null добавить, эффект тот же а для базы сииильно дешевле будет. OID на пользовательской таблице - идея плохая. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2018, 15:10 |
|
Обновить ТОЛЬКО ОДНУ запись
|
|||
---|---|---|---|
#18+
qwwqочередной . извините. наше вам здрасьте. не подскажете, с какого пж дефолтный with oids сменился на визаут ? и каковы причины отказа разработчиков от чемодана без ручки ? Очень очень давно, столько не живут ни базы ни проекты. Причины отказа: 1)4 байта в любую строку небесплатные сильно 2)выдача OID дорогая операция так как он shared по всей базе 3)а нафиг он вообще нужен в пользовательских таблицах? И главное: OID еще и нифига не уникален в таблице что вы легко обнаружите сделав таблицу с WITH OIDS в которой больше 2 с копейками миллиардов строк :)) (более того легко можно на долгосрочной работе получить небольшую таблицу с WITH OIDS и дублями). Поэтому даже WITH OIDS ничего вам на счет уникальности не гарантирует . (На системных таблицах стоит защита от этого специальная... и уникальные индексы). ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2018, 15:16 |
|
Обновить ТОЛЬКО ОДНУ запись
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2018, 01:28 |
|
Обновить ТОЛЬКО ОДНУ запись
|
|||
---|---|---|---|
#18+
Flashpoke Код: sql 1. 2. 3. 4. 5.
А вот это действительно новый и интересный вариант да :). Хотя я бы все таки nextval('test') = 1 сделал бы (на случай если такая строка одна). ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2018, 01:34 |
|
Обновить ТОЛЬКО ОДНУ запись
|
|||
---|---|---|---|
#18+
Flashpoke Код: sql 1.
И drop в одной транзакции с create, чтобы обеспечить монопольный доступ к нужному значению. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2018, 08:29 |
|
Обновить ТОЛЬКО ОДНУ запись
|
|||
---|---|---|---|
#18+
p2.Flashpoke Код: sql 1.
И drop в одной транзакции с create, чтобы обеспечить монопольный доступ к нужному значению. монополья уже есть : Код: sql 1. 2. 3.
https://www.postgresql.org/docs/current/static/sql-createsequence.html остается рестартить на каждом стейтменте. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2018, 09:37 |
|
|
start [/forum/topic.php?fid=53&msg=39642250&tid=1995777]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
356ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 294ms |
total: | 748ms |
0 / 0 |