[MySQL] Multiple rows update, single query?

Pagina: 1
Acties:
  • 151 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

Anoniem: 23998

Topicstarter
Ik heb hier op GoT en in de MySQL-manual rondgekeken naar een mogelijkheid om multiple rows te updaten met één single query ipv via een lus, aangezien dit nogal ten koste gaat van de performance. Kan hier helaas niets over vinden.

Iemand een idee of dit überhaupt mogelijk is? Ofwel; onderstaande mogelijkheid, maar dan via een single query:
code:
1
2
3
4
for ($i=0;$i<$aantalRows;$i++) {
   $sql = "UPDATE table SET record_value = '$values[$i]' WHERE record_id = '$i'";
   mysql_query($sql);
}

[ Voor 29% gewijzigd door Anoniem: 23998 op 19-04-2004 17:45 ]


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 10-07 21:22

Creepy

Tactical Espionage Splatterer

Een normaal update statement update meerdere rows.
code:
1
update blaat set veld1="woei" where veld2="dinges"

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 19:46
Je kan toch gewoon de WHERE clause uitbreiden?

Zoiets denk ik dan aan:
code:
1
UPDATE tableName SET field1 = field1 + 1 WHERE field2 < 99

Acties:
  • 0 Henk 'm!

Anoniem: 23998

Topicstarter
Kan niet eenvoudigweg werken met een +1 ofzo, aangezien het om een uniek ID gaat. Zeg maar zoiets als 0403A2019, de 2e id kan ineens 0308A1001 zijn.

Ik heb dus een form:

<input type=text name=0403A2019>
<input type=text name=0308A1001>

En vervolgens moet dus de waarde uit ieder textfield geupdate worden in de database-tabel.

Acties:
  • 0 Henk 'm!

  • Paul
  • Registratie: September 2000
  • Laatst online: 09-07 15:09
Ieder record dat voldoet aan je where-statement zal worden veranderd.
Geef je geen wherestatement op, dan wordt gewoon alles veranderd, maar je kunt natuurlijk in de where-statement zetten wat je wilt :)

Als ieder record een andere waarde moet krijgen dan zul je aan een lus moeten, maar als ze allemaal dezelfde waarde (in een bepaald veld) moeten hebben kun je gewoon een passende where-clausule maken.

[ Voor 34% gewijzigd door Paul op 19-04-2004 17:57 ]

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


Acties:
  • 0 Henk 'm!

Anoniem: 23998

Topicstarter
Paul Nieuwkamp schreef op 19 april 2004 @ 17:55:
Ieder record dat voldoet aan je where-statement zal worden veranderd.
Geef je geen wherestatement op, dan wordt gewoon alles veranderd, maar je kunt natuurlijk in de where-statement zetten wat je wilt :)
Het is moet dus zoiets zijn als:
code:
1
UPDATE table (SET record = '$cgi[0101A1001]' WHERE id = '0101A1001]) AND (SET record = '$cgi[0301A4021]' WHERE id = '0301A4021');

Iets in die geest.

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:24
Euh, dit is basiskennis SQL hoor.
Lees dit eens:
sql tutor

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Leg es iets beter uit hoe je een en ander bepaald en wat er veranderd?

Als het een functie op de waarden is, dan is het vrij eenvoudig om de boel in een enkele update te stoppen. Als het geen functie is, dan moet je kijken hoeveel wijzigingen je hebt. Je zou bijvoorbeeld een query op kunnen bouwen met een CASE-statement erin:
SQL:
1
UPDATE tabel SET veld = CASE veld WHEN X1 THEN Y1 WHEN X2 THEN Y2 ELSE veld END;

En die X* en Y* dan met je code invullen.

Als je echter veel X-en en Y-en hebt, en ook nog eens de boel meer dan 1x wilt kunnen doen (anders boeit de performance niet zo), dan kan je het wellicht beter zo aanpakken:
SQL:
1
2
3
4
5
6
CREATE TABLE new_tabel LIKE tabel; (oid, weet de syntax niet helemaal uit mijn hoofd)
CREATE TABLE mapping (x_value..., y_value...);
INSERT INTO mapping VALUES (X1, Y1), (X2, Y2) ....;
INSERT INTO new_tabel 
   SELECT ..., IF(NOT ISNULL(m.x_value), m.y_value, t.veld) ...
      FROM tabel LEFT JOIN mapping ON tabel.veld = mapping.x_value;

En dan nog de oude tabel weggooien en de nieuwe renamen.

[edit]
Sinds wanneer is dit basic SQL whoami?

[ Voor 9% gewijzigd door ACM op 19-04-2004 18:33 ]


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:24
Hmmm, te snel gelezen. :+

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Anoniem: 23998

Topicstarter
ACM schreef op 19 april 2004 @ 18:28:
SQL:
1
UPDATE tabel SET veld = CASE veld WHEN X1 THEN Y1 WHEN X2 THEN Y2 ELSE veld END;
Thanx! Dit is helemaal wat ik zocht!
Ik heb het inmiddels ook al werkend! Top!
Pagina: 1