[mysql] update/replace op tabellen

Pagina: 1
Acties:

  • Haranaka
  • Registratie: September 2000
  • Laatst online: 07-06 23:13
Mijn kleine database bevat op dit moment 2 tables:
Table 1 (stats) heeft 3 kolommen: naam, X, Y.
Table 2 (zooi) heeft 2 kolommen: Z, naam.
(XYZ zijn gewoon een zooi getalletjes)

Nu wil ik uit table 2 de Z score overbrengen naar table1, en dan wel dat hij de Y score overschijft.
Ik kom er alleen niet uit met welk commando ik dat moet doen :(
Ik zit te kutten met:
update stats set Y=?? maar hoe moet je hier zeggen dat hij de Z moet pakken uit zooi (table2). En het moet dus wel zo zijn dat hij dat doet als de namen overeenkomen.

Iemand die me een eindje in de goede richting wil helpen? Of me helemaal helpen mag natuurlijk ook :+

edit:

Oeps, ik had nog geen geschikte topic title bedacht |:(
Als een modje hierlangs fietst maak er maar wat leuks van:
[mysql] gegevens uit andere table halen

...


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:01
UPDATE table
SET Y = (SELECT Z from table2 WHERE id = ??)
WHERE table.id = ??

https://fgheysels.github.io/


  • Onno
  • Registratie: Juni 1999
  • Niet online
Op woensdag 28 november 2001 18:12 schreef whoami het volgende:
UPDATE table
SET Y = (SELECT Z from table2 WHERE id = ??)
WHERE table.id = ??
MySQL doet niet aan subqueries.

  • Haranaka
  • Registratie: September 2000
  • Laatst online: 07-06 23:13
Op woensdag 28 november 2001 18:16 schreef Onno het volgende:

[..]

MySQL doet niet aan subqueries.
:'(

...


  • Onno
  • Registratie: Juni 1999
  • Niet online
Ik denk dat je dus gewoon eerst de gewenste data uit tabel 2 moet selecten, om daarna in een loopje voor elk record een update richting tabel 1 te sturen.

  • Haranaka
  • Registratie: September 2000
  • Laatst online: 07-06 23:13
Op woensdag 28 november 2001 18:19 schreef Onno het volgende:
Ik denk dat je dus gewoon eerst de gewenste data uit tabel 2 moet selecten, om daarna in een loopje voor elk record een update richting tabel 1 te sturen.
Sorry maar kun je iets specifieker zijn, ik geen wizkid zijn.
Gewenste data uit die tabel selcteren geen probleem, maar dan?

...


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

Annie

amateur megalomaan

Kan je niets met REPLACE INTO bla .... SELECT bla FROM ... ?

Of eerst de waarden inserten in een tijdelijke tabel en daarna overzetten als de performance met meerdere UPDATEs te laag is?

Today's subliminal thought is:


  • Onno
  • Registratie: Juni 1999
  • Niet online
Op woensdag 28 november 2001 19:27 schreef Annie het volgende:
Kan je niets met REPLACE INTO bla .... SELECT bla FROM ... ?
Hmm.. dat gaat inderdaad wel werken denk ik. Ik vraag me alleen een beetje af hoe MySQL bepaalt welk record geupdate moet worden. De manual schrijft
REPLACE works exactly like INSERT, except that if an old record in the table has the same value as a new record on a unique index, the old record is deleted before the new record is inserted.
Hij kijkt naar 'een' unieke index. Maar wat als je meerdere unieke indices hebt? Wat gebeurt er dan?
Op woensdag 28 november 2001 18:23 schreef Haranaka het volgende:
Gewenste data uit die tabel selcteren geen probleem, maar dan?
In welke taal programmeer je?

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:01
Op woensdag 28 november 2001 18:23 schreef Haranaka het volgende:

[..]

Sorry maar kun je iets specifieker zijn, ik geen wizkid zijn.
Gewenste data uit die tabel selcteren geen probleem, maar dan?
Ik dacht dat hier alleen maar whizzkids kwamen? >:)
code:
1
2
3
4
5
6
7
8
DECLARE cur1 CURSOR FOR
SELECT * FROM table 

FOREACH cur1 INTO struct_rec
  UPDATE tabel2
     SET Y = struct_rec = struct_rec.x
    WHERE tabel2.id  = ??
END FOREACH

zoiets ongeveer, maar dan moet je het wel nog naar uw specifieke taal vertalen.

https://fgheysels.github.io/


  • Haranaka
  • Registratie: September 2000
  • Laatst online: 07-06 23:13
In welke taal ik programeer. Ik wil gewoon in een simpel bash scriptje de boel ongeveer zo doen:
mysql < script > output

en gewoon een filetje scrpt aanmaken met daarin de commando's voor mysql.

...


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

Annie

amateur megalomaan

Op woensdag 28 november 2001 19:36 schreef Onno het volgende:
Hmm.. dat gaat inderdaad wel werken denk ik. Ik vraag me alleen een beetje af hoe MySQL bepaalt welk record geupdate moet worden. De manual schrijft
[iets over delete en daarna insert]
Hmm, nu ik er over nadenk zal het misschien toch niet werken. Als er eerst een delete wordt uitgevoerd ben je de X-waarde kwijt (die komt niet mee met de andere tabel), tenzij je deze weer met een join in de SELECT kan meenemen.

Kwestie van uitproberen dus.

Meerdere uniques :? Nou geen lastige vragen gaan stellen ;)

Today's subliminal thought is:


  • Onno
  • Registratie: Juni 1999
  • Niet online
Op woensdag 28 november 2001 19:46 schreef Annie het volgende:
Hmm, nu ik er over nadenk zal het misschien toch niet werken. Als er eerst een delete wordt uitgevoerd ben je de X-waarde kwijt (die komt niet mee met de andere tabel), tenzij je deze weer met een join in de SELECT kan meenemen.
Dat wordt dus eens een JOIN van tabel 1 en 2 naar een temptabel, en daarna een REPLACE vanuit de temptabel naar tabel 1. :)
Op woensdag 28 november 2001 19:42 schreef Haranaka het volgende:
In welke taal ik programeer. Ik wil gewoon in een simpel bash scriptje de boel ongeveer zo doen:
mysql < script > output

en gewoon een filetje scrpt aanmaken met daarin de commando's voor mysql.
Hmm.. dat is lastig, omdat je op die manier niks met resultsets kunt doen.

Maar zoiets *zou* kunnen werken:
code:
1
2
3
create temporary table blaat (naam varchar(..), x int, y int);
insert into blaat select tabel1.naam,tabel1.x,tabel2.z from tabel1,tabel2 where tabel2.naam=tabel1.naam;
replace into tabel1 select * from blaat;

(syntax-fouten voorbehouden)

  • Haranaka
  • Registratie: September 2000
  • Laatst online: 07-06 23:13
code:
1
2
3
create temporary table blaat (naam varchar(..), x int, y int);
insert into blaat select tabel1.naam,tabel1.x,tabel2.z from tabel1,tabel2 where tabel2.naam=tabel1.naam;
replace into tabel1 select * from blaat;

Dit werkt bijna, alleen dat replace werkt neit helemaal volgens mij. Hij maakt nu een nieuwe rij aan met de nieuwere gegevens, ipv dat hij de oude rij overschijft.

...


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

Annie

amateur megalomaan

Op woensdag 28 november 2001 21:21 schreef Haranaka het volgende:

Dit werkt bijna, alleen dat replace werkt neit helemaal volgens mij. Hij maakt nu een nieuwe rij aan met de nieuwere gegevens, ipv dat hij de oude rij overschijft.
Dan heb je waarschijnlijk geen unique index op de tabel (waar je de replace op uitvoert) zitten.

Today's subliminal thought is:


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

beetje uitgebreidere topictitel gegeven.
Pagina: 1