update iba jedného riadku bez PK

8 views
Skip to first unread message

Michal Páleník

unread,
Dec 15, 2021, 4:30:41 AM12/15/21
to PostgreSQL-cz
ahojte

ak chcete urobiť update iba jedného riadku typu

update tt set pocet=200 where ab='a' limit 1;

a nemáte primary key, môžete použiť

update tt set pocet=200 where
ctid in (select ctid from tt where ab='a' limit 1);

(samozrejme nemať primárny kľúč nie je ideálne, lebo teraz updatujem
jeden náhodný riadok)


--
Michal Páleník
www.oma.sk

Peter

unread,
Dec 15, 2021, 8:50:47 AM12/15/21
to PostgreSQL-cz
...a potom to spustis na particionovanej tabulke a updatne to viac ako jeden riadok.
Je dobre vzdy pouzit tuple (ctid, tableoid): ...where (ctid, tableoid) = (select ctid, tableoid from tt limit);

Aj Pavel to mal na svojej wiki bez tableoid. Niekde doplnil, inde zostalo samotne ctid.

Este semanticka poznamka k `ctid in (select ... limit 1)`: ak sa od subselectu ocakava skalar, je lepsie pouzit operator =, pretoze pri nechcenej zmene subquery (odstranenie/navysenie LIMIT - co sa lahko stane, ak je subselect schovany za volanim funkcie), to v runtime hodi vynimku.


.pl.

Dátum: streda 15. decembra 2021, čas: 10:30:41 UTC+1, odosielateľ: Michal Páleník

Pavel Stehule

unread,
Dec 15, 2021, 11:37:55 AM12/15/21
to PostgreSQL-cz


st 15. 12. 2021 v 14:51 odesílatel Peter <pgs...@gmail.com> napsal:
...a potom to spustis na particionovanej tabulke a updatne to viac ako jeden riadok.
Je dobre vzdy pouzit tuple (ctid, tableoid): ...where (ctid, tableoid) = (select ctid, tableoid from tt limit);

Aj Pavel to mal na svojej wiki bez tableoid. Niekde doplnil, inde zostalo samotne ctid.

on je to hodne stary trik - mozna 15 let stara zalezitost - je to starsi nez partitioning (resp. nez se partitioning zacal pouzivat).
 

Este semanticka poznamka k `ctid in (select ... limit 1)`: ak sa od subselectu ocakava skalar, je lepsie pouzit operator =, pretoze pri nechcenej zmene subquery (odstranenie/navysenie LIMIT - co sa lahko stane, ak je subselect schovany za volanim funkcie), to v runtime hodi vynimku.

Pavel
 


.pl.

Dátum: streda 15. decembra 2021, čas: 10:30:41 UTC+1, odosielateľ: Michal Páleník
ahojte

ak chcete urobiť update iba jedného riadku typu

update tt set pocet=200 where ab='a' limit 1;

a nemáte primary key, môžete použiť

update tt set pocet=200 where
ctid in (select ctid from tt where ab='a' limit 1);

(samozrejme nemať primárny kľúč nie je ideálne, lebo teraz updatujem
jeden náhodný riadok)


--
Michal Páleník
www.oma.sk

--
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny „PostgreSQL-cz“ ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu postgresql-c...@googlegroups.com.
Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/postgresql-cz/bb2b335f-6785-41d6-9d16-869d1250691en%40googlegroups.com.

Pavel Stehule

unread,
Dec 16, 2021, 11:38:20 PM12/16/21
to PostgreSQL-cz


st 15. 12. 2021 v 17:37 odesílatel Pavel Stehule <pavel....@gmail.com> napsal:


st 15. 12. 2021 v 14:51 odesílatel Peter <pgs...@gmail.com> napsal:
...a potom to spustis na particionovanej tabulke a updatne to viac ako jeden riadok.
Je dobre vzdy pouzit tuple (ctid, tableoid): ...where (ctid, tableoid) = (select ctid, tableoid from tt limit);

Aj Pavel to mal na svojej wiki bez tableoid. Niekde doplnil, inde zostalo samotne ctid.


přidal jsem tam komentář.

Díky za upozornění :)

Pavel
Reply all
Reply to author
Forward
0 new messages