C:\Program Files\PostgreSQL\8.3\bin>psql -d foobar
Password for user [...]:
Welcome to psql 8.3.6 (server 8.3.3), the PostgreSQL interactive terminal.
[...]
foobar=# begin;
BEGIN
foobar=# select objid, sorrend from valami_tablafele where katid = 147 order by sorrend;
objid | sorrend
-------+---------
1813 | 1
5135 | 2
1811 | 3
1388 | 4
1844 | 5
1253 | 6
5126 | 7
1835 | 8
5152 | 9
1203 | 10
1845 | 11
(11 rows)
foobar=# select objid, sorrend from valami_tablafele where katid = 147 and sorrend > 5 order by sorrend;
objid | sorrend
-------+---------
1253 | 6
5126 | 7
1835 | 8
5152 | 9
1203 | 10
1845 | 11
(6 rows)
foobar=# update valami_tablafele set sorrend = sorrend - 1 where katid = 147 and sorrend > 5 returning objid, sorrend;
objid | sorrend
-------+---------
1203 | 9
1253 | 5
5126 | 6
1835 | 7
5152 | 8
(5 rows)
UPDATE 5
foobar=# select objid, sorrend from valami_tablafele where katid = 147 order by sorrend;
objid | sorrend
-------+---------
1813 | 1
5135 | 2
1811 | 3
1388 | 4
1844 | 5
1253 | 5
5126 | 6
1835 | 7
5152 | 8
1203 | 9
1845 | 11
(11 rows)
Oké, hogy nem mai Postgres, de a legutolsó 8.3-n is ezt csinálja és ekkora hibát nem követhetnek már el...
- saxus blogja
- A hozzászóláshoz be kell jelentkezni
- 986 megtekintés
Hozzászólások
Újabb vicc: ha hozzáadunk egy egy 12-st is a lista végére, akkor azt csökkenti, de a 11-st nem.
----------------
Lvl86 Troll
- A hozzászóláshoz be kell jelentkezni
Ez tetszik :)
- A hozzászóláshoz be kell jelentkezni
Nekem is tetszene, ha nem kellene rá marhagyorsan megoldást találni. :)
----------------
Lvl86 Troll
- A hozzászóláshoz be kell jelentkezni
Megnéztem, nálam jól működik. psql 8.3.7
- A hozzászóláshoz be kell jelentkezni
Mondjuk lehet tényleg index gondok lesznek, mert most amióta újraépítettem azokat, azóta már csak a 6,7,8 -s sorrendű rekordokat updateli.
----------------
Lvl86 Troll
- A hozzászóláshoz be kell jelentkezni
Oracle alatt láttunk hasonlót.
Ott az volt az oka, hogy szét volt csúszva az index és a tábla.
Index újjáépítés megoldotta.
- A hozzászóláshoz be kell jelentkezni
Nade két külön egymástol teljesen független szerveren, ráadásul úgy, hogy egyik querynél jó, másiknál nem?
----------------
Lvl86 Troll
- A hozzászóláshoz be kell jelentkezni
most nem azer mondom de szerintem ez az update nem koser
" update valami_tablafele set sorrend = sorrend - 1 where katid = 147 and sorrend > 5 returning objid, sorrend; "
Az update olyan mezoket update el amelyekre az update ben szereplő where vonatkozik, ez ha mukodik is akkor is randa sztem vagy az adatbazis struktura vagy a programterv ha ilyen update kell.
De ha mindenkeppen ilyen ocsmanysag kell akkor en ugy probalnam meg hogy 1 temp tablaba kigyujtenem a where feltetelnek megfelelo adatokat az update elott, aztan abbol updatelnem a tablat... proba cseresznye
- A hozzászóláshoz be kell jelentkezni
Ez egy teljesen szabalyos lekerdezes, ugyanis a where _mindig_ elobb kell lefusson, mint maga az update. Es nem hibas a struktura vagy programterv, barmikor szukseg lehet ilyen modositasra (gondoljunk egy termeklista savos aremelesere).
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
De, ez így kóser.
Egyetlen speciális dolog, a returning rész, mert az postgresql specifikus. (Visszaadja az updatelt sorok eredményét, szigorúan az új értékkel.)
----------------
Lvl86 Troll
- A hozzászóláshoz be kell jelentkezni