[MySQL] Meerdere updates per query

Pagina: 1
Acties:

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Ik heb een functie die een aantal update queries uitvoerd:
code:
1
update xcl_players set rank = %d, mtime = mtime where pid = %d


Is het nu mogelijk om dit in een query te doen, zoals een multi-row insert of replace, maar dan met update?
rank is voor alle pids verschillend, dus het kan niet met de 'normale' update syntax:
code:
1
2
3
4
5
UPDATE [LOW_PRIORITY] [IGNORE] tbl_name
    SET col_name1=expr1 [, col_name2=expr2 ...]
    [WHERE where_definition]
    [ORDER BY ...]
    [LIMIT row_count]

code:
1
2
3
UPDATE [LOW_PRIORITY] [IGNORE] tbl_name [, tbl_name ...]
    SET col_name1=expr1 [, col_name2=expr2 ...]
    [WHERE where_definition]

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 21-05 21:51

pistole

Frutter

uhm...
Nee?
Je kan geen meerdere WHERE clauses in 1 statement hebben dus gaat dat niet lukken.

Tenzij, in Transact SQL (microsft sqlserver) zou misschien hetvolgende kunnen:
SQL:
1
2
3
4
5
6
7
8
9
10
UPDATE 
    tabel
SET 
    veld=case 
        when id=1 then 'a' 
        when id=2 then 'b'
        ...
    end
where
    id in (1,2,.....)

Maar ja. Dat is ook weer niet mooi, als het al zou werken ;)

[ Voor 15% gewijzigd door pistole op 18-11-2003 16:08 ]

Ik frut, dus ik epibreer


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
pistole schreef op 18 november 2003 @ 16:06:
uhm...
Nee?
Je kan geen meerdere WHERE clauses in 1 statement hebben dus gaat dat niet lukken.
Dat snap ik, maar met replace kan het wel. Alleen wil ik dat de oude rij niet wordt verwijdered, maar alleen wordt geupdate.

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 21-05 21:51

pistole

Frutter

OlafvdSpek schreef op 18 november 2003 @ 16:09:
[...]

Dat snap ik, maar met replace kan het wel. Alleen wil ik dat de oude rij niet wordt verwijdered, maar alleen wordt geupdate.
Ik volg je niet meer. Sinds wanneer verwijder je iets met een UPDATE?
Of wil je iets historisch vasthouden?

Ik frut, dus ik epibreer


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
pistole schreef op 18 november 2003 @ 16:11:
Ik volg je niet meer. Sinds wanneer verwijder je iets met een UPDATE?
Of wil je iets historisch vasthouden?
Met UPDATE verwijder je niets. Maar met REPLACE wel. Wat ik probeerde te zeggen is dat REPLACE bijna doet wat ik wil, alleen worden de overige velden dan op default gezet (denk ik).

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 21-05 08:48

chem

Reist de wereld rond

een REPLACE is niks meer dan een DELETE gevolgd door een INSERT...
Dus nee, erg mooi kan dit niet. Alleen een transaction is ws sneller (gecombineerde disk I/O)

Klaar voor een nieuwe uitdaging.


  • SPee
  • Registratie: Oktober 2001
  • Laatst online: 22-05 12:06
Als je een UPDATE doet en je zet "SET rank = 1" dan zal hij alle velden in rank op 1 zetten. Met de limiter "WHERE pid = $pid" geeft je aan aan welke voorwaarde hij moet voldoen. In dit geval bij pid.

Dus wil je alle velden in rank op 1 > UPDATE table SET rank =1
Wil je alle velden van pid 10 op 1 > UPDATE table SET rank =1 WHERE pid = 10

let the past be the past.


  • pistole
  • Registratie: Juli 2000
  • Laatst online: 21-05 21:51

pistole

Frutter

SPee schreef op 18 november 2003 @ 16:20:

Dus wil je alle velden in rank op 1 > UPDATE table SET rank =1
Wil je alle velden van pid 10 op 1 > UPDATE table SET rank =1 WHERE pid = 10
Die constructie gaf TS zelf ook al. De vraag is dus hoe je meerdere records kan updaten met andere waarden. Volgens mij kan dat niet.

Tenzij het natuurlijk gaat om een SET RANK=RANK+1 oid, dan kan het weer wel.

Ik frut, dus ik epibreer


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Even een kick (zit weer in een situatie waar ik deze functionaliteit nodig heb).
Ik heb een MySQL feature request gesubmit, maar het antwoord was:
no not yet.
We don't currently have plans to support this (non-standard) syntax
Is dit ook in de standaard SQL syntax niet mogelijk?

Een work-around denk ik wel te hebben, een extra tabel aanmaken voor de update data en dan met een 'joined' update de originele tabel updaten.

[ Voor 8% gewijzigd door Olaf van der Spek op 05-09-2004 13:55 ]


  • TheDane
  • Registratie: Oktober 2000
  • Laatst online: 20:27

TheDane

1.618

ik snap even niet precies waarom je 't in 1 query "moet" doen?
Je kunt toch gewoon meerdere queries uitvoeren ?

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Vooral bij wat meer rows (1000+), een MySQL server die op een ander system draait en een vrij drukke SQL server is 1000+ aparte queries niet zo'n snelle oplossing.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

OlafvdSpek schreef op 05 september 2004 @ 13:48:
Is dit ook in de standaard SQL syntax niet mogelijk?
Nee, sla de SQL99 syntax er maar op na. :)
OlafvdSpek schreef op 05 september 2004 @ 14:04:
Vooral bij wat meer rows (1000+), een MySQL server die op een ander system draait en een vrij drukke SQL server is 1000+ aparte queries niet zo'n snelle oplossing.
Je oplossing van een tussentabel werkt wel, maar dan heb je nog steeds het feit dat die tabel gevuld moet worden. ;) Dus nog steeds een aardig aantal queries waarschijnlijk.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
NMe84 schreef op 05 september 2004 @ 14:09:
Je oplossing van een tussentabel werkt wel, maar dan heb je nog steeds het feit dat die tabel gevuld moet worden. ;) Dus nog steeds een aardig aantal queries waarschijnlijk.
Dat kan gewoon met een enkele multi-row insert query, toch?
En is die standard kosteloos downloadbaar of moet daar voor bestaald worden?

[ Voor 11% gewijzigd door Olaf van der Spek op 05-09-2004 14:38 ]

Pagina: 1