[MySQL] UPDATE ... ORDER BY ...

Pagina: 1
Acties:

  • bartvb
  • Registratie: Oktober 1999
  • Laatst online: 21:39
Dit is het probleem:

mysql> UPDATE categories SET cat_id = cat_id+2 ORDER BY cat_id DESC;
ERROR 1064: You have an error in your SQL syntax near 'ORDER BY cat_id' at line 1

Volgens de MySQL manual zou dit gewoon moeten werken :?

Ik gebruik MySQL 3.23.56-log, Internet ook al afgezocht maar ik kan dus totaal niet vinden wat hier nou mis gaat |:(

Iemand enig idee?

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:02
Waarom zou je een ORDER BY clausule in een UPDATE statement willen hebben?

AFAIK is een ORDER BY in een UPDATE statement gewoon niet mogelijk.

[ Voor 33% gewijzigd door whoami op 31-03-2003 23:37 ]

https://fgheysels.github.io/


  • momania
  • Registratie: Mei 2000
  • Laatst online: 00:32

momania

iPhone 30! Bam!

Bij een UPDATE heeft het geen nut om de ORDER BY te gebruiken.... |:(

[ Voor 10% gewijzigd door momania op 31-03-2003 23:37 ]

Neem je whisky mee, is het te weinig... *zucht*


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

wel als je de categorieen in een bepaalde volgorde wilt wijzigen (bijvoorbeeld zodat je geen primary keys schendt) of je er maar enkele wil veranderen (ja een limit kan ook :o )

Probeer dit nog es?
UPDATE categories SET cat_id = cat_id+2 WHERE 1 ORDER BY cat_id DESC;

[ Voor 21% gewijzigd door ACM op 31-03-2003 23:40 ]


  • KompjoeFriek
  • Registratie: Maart 2001
  • Laatst online: 02-01 05:18

KompjoeFriek

Statsidioot

Misscien is dit iets voor je : SQL-tutorial

WhatPulse! - Rosetta@Home - Docking@Home


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:02
ACM schreef op 31 March 2003 @ 23:39:
wel als je de categorieen in een bepaalde volgorde wilt wijzigen (bijvoorbeeld zodat je geen primary keys schendt)


Insinueer jij nu dat je PK's van waarde gaat veranderen?

https://fgheysels.github.io/


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
ACM schreef op 31 March 2003 @ 23:39:
wel als je de categorieen in een bepaalde volgorde wilt wijzigen (bijvoorbeeld zodat je geen primary keys schendt) of je er maar enkele wil veranderen (ja een limit kan ook :o )

Probeer dit nog es?
UPDATE categories SET cat_id = cat_id+2 WHERE 1 ORDER BY cat_id DESC;


Da's dus alleen mogelijk bij Multiple Table updates.
3x raden wat MySQL 3.23.x niet ondersteunt ;) http://www.mysql.com/doc/en/Nutshell_4.0_features.html

  • bartvb
  • Registratie: Oktober 1999
  • Laatst online: 21:39
Eeh, nee.. Juist niet ;)
Uit de manual:

"Note: you can not use ORDER BY or LIMIT with multi-table UPDATE."

Ik had het al een keer geprobeerd met die WHERE 1 er tussen, ook dat hielp niet. Ik snap er echt helemaal niets van.

Je kan het overigens makkelijk zelf testen door iets te doen als:

UPDATE categories SET cat_id = cat_id WHERE 1 ORDER BY cat_id DESC

Windoos-vernieler: ALs je het zelf niet snapt is het niet echt nuttig om iemand anders een tutorial aan te raden :P

En idd, ik heb die sort nodig ivm primary key problemen.. Als ik nu cat_id=cat_id+2 doe en cat_id=1 veranderd in 3 dan krijg ik allemaal leuke MySQL errors als er al een cat_id=3 al bestond.. Als ik ze echter van groot naar klein 'omnummer' heb ik dat probleem niet.

Irritant dit |:(

* bartvb heeft geen zin die duizenden records 1 voor 1 te gaan updaten :(

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
bartvb schreef op 01 April 2003 @ 00:47:
Eeh, nee.. Juist niet ;)
Uit de manual:

"Note: you can not use ORDER BY or LIMIT with multi-table UPDATE."

Kan iemand goedkoop een bril voor me bestellen |:(

Verwijderd

Je zou naturlijk met een 1-malig te draaien conversiescriptje met 1 loopje erin dit kunnen oplossen zonder ORDER BY in je UPDATE statement te gebruiken ....

Stappenplan:
1) Maak een array met alle ID's, gesorteerd van hoog naar laag
2) Loop door deze array, en doe een losse update voor ieder ID

  • Bud_s
  • Registratie: Maart 2002
  • Laatst online: 23-08 12:02
als je wil voorkomen dat records meerdere malen worden opgehoogd, ff een extra veldje (vlagetje) toevoegen en deze van een waarde voorzien tijdens de update. (en natuurlijk test of er al een update gedraaid is. evt. dit veld eerst vullen met de originele ID, zodat je altijd terug kan ;)

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 22-08 16:45
1) SET cat_id = cat_id+maxid, waarbij maxid het hoogst voorkomende id is
2) SET cat_id = cat_id-maxid+2

  • bartvb
  • Registratie: Oktober 1999
  • Laatst online: 21:39
Gimli: Ik doe geen multi-table update :) Het gaat hier alleen om de tabel 'categories'.

Idd, ik zou een script kunnen maken die dus alles 1 voor 1 ophoogt, probleem is dat dat verre van netjes is (IMHO) en het is niet leuk met een paar tabellen die tegen een miljoen records aan zitten. Extra veldje toevoegen voor het ophogen van wat nummers lijkt me wat overkill ;) Had idd ook zitten denken aan een oplossing als die van Sjaaky.

Maar ik blijf het absurt vinden dat dit niet gewoon werkt :? Snap er niets van |:(

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

SQL is een set/verzameling georienteerde taal.
Je wilt en verzameling veranderen en een verzameling kent geen volgorde.
Alleen een extractie uit de verzameling kent een presentatie volgorde, maar dit is geen retrieval of bewerkingsvolgorde.

Kortom vergeet het maar.
Mogelijkheden die ik zie zijn:
1. update in 2 stappen zoals Sjaaky aangaf
2. drop de constraints en unique indices en voer de update uit en creeer de indices en constraints opnieuw

Het blijft natuurlijk wel vaag dat je de PK van een tabel wilt updaten

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

misschien is dit wel iets voor je?

Een poging de magie rond MySQL te verwijderen :)

:)

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • bartvb
  • Registratie: Oktober 1999
  • Laatst online: 21:39
Goodielover: ik wil 2 tabellen (2 forums) samenvoegen, namelijk www.phpbb.nl en www.phpbb-nl.com
Daarvoor moet ik dus o.a. die cat_id's ophogen.

Verder kan je volgens de manual een bewerkingsvolgorde opgeven. Ik zie echt niiet waarom die query van mij niet werkt :\

De magie rond MySQL :D Tja..
Ik zou best over willen stappen (vooral met m'n eigen forum) maar ik heb het nog steeds niet voor elkaar gekregen m'n MySQL DB (van 1.2GB) over te zetten naar PostgreSQL :\ Heb het aan de gang gekregen maar dan was hij een dag bezig, was ie op 20% ofzo en dan kwam hij een of andere stomme fout tegen waarna het feestje weer opnieuw kon beginnen :( Ik houd me dus aanbevolen voor fatsoenlijke convertors :)

Maar intussen snap ik dus nog even niets van MySQL ;)

  • Joeroenho
  • Registratie: Augustus 2001
  • Niet online
Misschien kan je het in een paar stappen proberen:
- websites offline halen
- select statement doen van alle gegevens in de cat-tabel waarvan je de ID's wil ophogen, gesorteerd op cat-ID DESC
- relatie tussen de tabellen ff eruitmikken
- categorie-tabel leegmikken
- alle categorieen terugzetten met INSERT door door je recordset te bladeren, alleen nu schrijf je voor iedere cat-ID de nieuwe (hogere) waarde weg.
- relatie tussen de tabellen terugzetten

Klaar!

Wel veel gedoe, maar ben bang dat er niks anders op zit...

P.S., maak een back-up vantevoren!!

Amateurcoureur en fervent banktukker


  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

bartvb schreef op 01 April 2003 @ 00:47:
Eeh, nee.. Juist niet ;)
Uit de manual:

"Note: you can not use ORDER BY or LIMIT with multi-table UPDATE."
Maar in een ander deel van de manual: http://www.mysql.com/doc/en/News-4.0.0.html

Ik zou gewoon voor een tijdelijke tabel gaan, inserten uit oude tabel, drop oude tabel en rename de nieuwe.
(indien mogelijk natuurlijk binnen een transaction en natuurlijk altijd een backupje maken)

offtopic:
Ik zie dat sommigen vinden dat een PK niet van waarde mag wijzigen. Ben het daar absoluut niet mee eens. Waarom zou deze waarde vast moeten zijn? Om je referentiele integriteit te behouden heb je de beschikking over cascading updates/deletes (tenminste in de betere rdbms-en).

[ Voor 9% gewijzigd door Annie op 01-04-2003 23:01 . Reden: transaction ]

Today's subliminal thought is:


  • DiNo!
  • Registratie: Juni 2000
  • Laatst online: 23:00
"referentiele integriteit" is een afspraak met jezelf en anderen over de database. Als je afspreekt dat PKs kunnen wijzigen dan is dat totaal verantwoord. Echter, menig buitenstaander (ik ook) zal je raar aankijken.

https://github.com/atoomnetmarc/


  • bartvb
  • Registratie: Oktober 1999
  • Laatst online: 21:39
Hmm, oops.
In die News-4.0.0.html staat idd dat dat 'ORDER BY' pas toegevoegd is in MySQL 4 *zucht*

Thanks iig :D
Ik ga ff een comment op die UPDATE pagina gooien :)

  • jochemd
  • Registratie: November 2000
  • Laatst online: 08-08 15:51
ACM schreef op 31 March 2003 @ 23:39:
wel als je de categorieen in een bepaalde volgorde wilt wijzigen (bijvoorbeeld zodat je geen primary keys schendt)
deferred primary key >:) (Kan dat eigenlijk?)

  • VisionMaster
  • Registratie: Juni 2001
  • Laatst online: 18-07 20:32

VisionMaster

Security!

Sjaaky schreef op 01 April 2003 @ 09:49:
1) SET cat_id = cat_id+maxid, waarbij maxid het hoogst voorkomende id is
2) SET cat_id = cat_id-maxid+2
Mijn SQL hart is gebroken :X :'( :|

Wat een *** oplossingen allemaal.
Er springt maar 1 uit. Kort doeltreffend en blijkbaar dat wat je wilt doen.
Sorry hoor maar een Order By in een update ... hoe stom kan iemand zijn dat voor te stellen dat het nut heeft. Als je een volgorde wil maken moet je een subselect maken in het WHERE stukje zoals iemand dat gewend is in een SELECT statement. :X
Dan kan je de volgorde van de id's afdwingen in jou volgorde te laten voldoen. Hij zal dan wel steeds de hele tabel moeten doorploegen, dus als het lekker groot is en je loopt niet over een index, dan kan het effe duren.

Limit kan ik me iets bij voorstellen, je doet dan de eerste paar alleen die je tegen komt in de volgorde die je wenst.

Waarom je die volgorde wilt maken? ik heb geen idee.
De gequote oplossing moet je maar eens aandachtig lezen en er je voordeel mee doen door deze misschien wat om te bouwen.

Je wilt de ene tabel met de andere verenigen en je gebruik dezelfde primary key namen? Dan moet je zoiets als dit doen je. Je hoogt dan alle categorie id's zover als het maximum van de eerste op.

Je kan ook nog die in een insert direct doen.
Als je de waarde van je hoogste getal in tabel1 kent, dan kan je de inhoud van tabel2 inserten met:

code:
1
2
3
4
insert into tabel1 (colomn1, column2, ...)
select cat_id + maxwaarde, column2, ...
from tabel2
where gelul = bla

[ Voor 6% gewijzigd door VisionMaster op 02-04-2003 01:54 ]

I've visited the Mothership @ Cupertino


  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

VisionMaster schreef op 02 April 2003 @ 01:53:
[...]

Mijn SQL hart is gebroken :X :'( :|

Wat een *** oplossingen allemaal.
dank je ;(
VisionMaster schreef op 02 April 2003 @ 01:53:
Als je een volgorde wil maken moet je een subselect maken in het WHERE stukje zoals iemand dat gewend is in een SELECT statement. :X
Alleen wordt dat helaas niet ondersteund in de versie die de TS gebruikt.
VisionMaster schreef op 02 April 2003 @ 01:53:
Je kan ook nog die in een insert direct doen.
Als je de waarde van je hoogste getal in tabel1 kent, dan kan je de inhoud van tabel2 inserten met:

code:
1
2
3
4
insert into tabel1 (colomn1, column2, ...)
select cat_id + maxwaarde, column2, ...
from tabel2
where gelul = bla
Dat zeg ik,... Gamma.

Today's subliminal thought is:


  • VisionMaster
  • Registratie: Juni 2001
  • Laatst online: 18-07 20:32

VisionMaster

Security!

Annie schreef op 02 april 2003 @ 12:25:
[...]
dank je ;(
[...]
Alleen wordt dat helaas niet ondersteund in de versie die de TS gebruikt.
Damn das zonde, maar toch niet echt een lekkere oplossing in dit geval. :P Dus nevermind...
Ah ik lees net je offtopic stukkie ... ;)

[ Voor 3% gewijzigd door VisionMaster op 02-04-2003 13:43 ]

I've visited the Mothership @ Cupertino


  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

VisionMaster schreef op 02 April 2003 @ 01:53:
[...]

Mijn SQL hart is gebroken :X :'( :|

[...]
Als je een volgorde wil maken moet je een subselect maken in het WHERE stukje zoals iemand dat gewend is in een SELECT statement. :X
Dan kan je de volgorde van de id's afdwingen in jou volgorde te laten voldoen. Hij zal dan wel steeds de hele tabel moeten doorploegen, dus als het lekker groot is en je loopt niet over een index, dan kan het effe duren.
[...]
Jij geeft aan dat je in een subselect wilt sorteren???

Is misschien niet alleen je SQL hart gebroken, maar ook je SQL verstand? :)

Je kunt juist alleen een ORDER BY in je main select-clause hebben en niet in sub-selects.

  • bartvb
  • Registratie: Oktober 1999
  • Laatst online: 21:39
Overigens is de MySQL manual inmiddels aangepast :)

  • VisionMaster
  • Registratie: Juni 2001
  • Laatst online: 18-07 20:32

VisionMaster

Security!

Goodielover schreef op 02 april 2003 @ 15:12:
[...]
Jij geeft aan dat je in een subselect wilt sorteren???

Is misschien niet alleen je SQL hart gebroken, maar ook je SQL verstand? :)

Je kunt juist alleen een ORDER BY in je main select-clause hebben en niet in sub-selects.
code:
1
2
3
select * from batch 
where TitleID  IN 
    (select titleID from batch order by titleID)

8)7 squeeze me O-)
Probeer eens eerst voordat je zegt dat het niet kan |:(

[ Voor 7% gewijzigd door VisionMaster op 02-04-2003 16:46 ]

I've visited the Mothership @ Cupertino


  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Wat voegt de order by nou toe aan dit statement?
TitleID zit of wel of niet in de subselect.
Als jij een order by wilt zou je die als volgt moeten opnemen.

code:
1
2
3
4
select *
from   tabel
where  T_ID IN (....)
order by T_ID


bovendien is er een verschil tussen niet kunnen en niet zinnig zijn.

Een order by in een subselect is niet zinnig en zou door een goed DBMS ook moeten worden afgekeurd.
Het lijkt nu meer op een query-optimiser statement

  • VisionMaster
  • Registratie: Juni 2001
  • Laatst online: 18-07 20:32

VisionMaster

Security!

Goodielover schreef op 02 April 2003 @ 17:03:
Wat voegt de order by nou toe aan dit statement?
TitleID zit of wel of niet in de subselect.
Als jij een order by wilt zou je die als volgt moeten opnemen.

code:
1
2
3
4
select *
from   tabel
where  T_ID IN (....)
order by T_ID


bovendien is er een verschil tussen niet kunnen en niet zinnig zijn.

Een order by in een subselect is niet zinnig en zou door een goed DBMS ook moeten worden afgekeurd.
Het lijkt nu meer op een query-optimiser statement
Ik wou even aantonen dat het kan, omdat de TS iets wou updaten in een bepaalde volgorde. Je kan dus allerlei zaken uit een WHERE clause gebruiken ook in de where van een update om bepaalde zaken af te dwingen.
Ik gebruik het Nooit en als je het nodig heb op deze manier dan moet je goed nadenken over wat je doet, maar lay-off het kan bigdeal ... :/

[edit]
en trouwens je heb de haakjes verkeerd staan in de code quote. Het gaat om:
code:
1
2
3
select *
from   tabel
where  T_ID IN (.... order by T_ID)

en niet... :( want dat wisten we al
code:
1
2
3
4
select *
from   tabel
where  T_ID IN (....)
order by T_ID

[ Voor 14% gewijzigd door VisionMaster op 02-04-2003 18:28 ]

I've visited the Mothership @ Cupertino

Pagina: 1