DigitalPlace.nl Forum

Programmeren => Scripttalen => Server-side => Topic gestart door: xvilo op december 29, 2015, 11:18:04 pm

Titel: SQL insert value en anders update value
Bericht door: xvilo op december 29, 2015, 11:18:04 pm
Hallo,

Ik ben bezig met SQL, maar nu wil ik graag dat hij een value insert. Als deze al bestaat, dan het bestaande updaten.
Mijn Database schema ziet er als volgt uit:
ID |  user_id  |  meta_key          |     meta_value 
------------------------------------------------------------
  1       0               iets               value
  2       0            nog_iets           value2
  3       1               iets               value
  4       1            nog_iets           value3

Nu wil ik bijvoorbeeld voor user 5, nog_iets inserten naar test.
Dat zou ik doen met de SQL query: INSERT INTO invoice_usermeta (user_id, meta_key, meta_value) VALUES(5, 'nog_iets','test'). Maar als ik dezelfde query zou willen gebruiken om nog_iets van user 4 te updaten naar value4, dat heb ik geprobeerd met de query:
INSERT INTO invoice_usermeta (user_id, meta_key, meta_value) VALUES(4, 'nog_iets','value4') ON DUPLICATE KEY UPDATE meta_value='value4'.
Maar dit laatste maakt gewoon een extra row aan....

Hoe zit dit?

//xvilo
Titel: Re: SQL insert value en anders update value
Bericht door: Buzzer op december 29, 2015, 11:29:51 pm
Dit wordt ook wel een "upsert" genoemd en kan alleen op de manier die je gevonden had (of het alternatief REPLACE INTO) als je een UNIQUE/PRIMARY_KEY kolom gebruikt in je query. Bij jou is alleen de combinatie van de kolommen user_id en meta_key uniek, en dan kan je niet ON DUPLICATE KEY of REPLACE INTO gebruiken.

Je zult of gewoon twee queries moeten draaien (tip: probeer eerst de update en kijk naar de affected row count die je terugkrijgt) of als je het heel ingewikkeld wilt maken een stored procedure schrijven.

Edit: ik heb toch nog wat specifiek op mysql gegoogled en het blijkt dat dit toch wel kan als je een unique index zou maken op de combinatie van de velden user_id en meta_key. Zie http://stackoverflow.com/a/635943/1239690 (http://stackoverflow.com/a/635943/1239690)
Titel: Re: SQL insert value en anders update value
Bericht door: xvilo op december 29, 2015, 11:46:41 pm
Okey, ik heb nu de INDEX aangemaakt voor user_id en meta_key maar als ik:
INSERT INTO invoice_usermeta (user_id, meta_key, meta_value) VALUES(4, 'nog_iets','value4') ON DUPLICATE KEY UPDATE meta_value='value4'
Doe maakt hij de row aan omdat deze nog niet bestaat, maar zodra ik er dit van maak maakt hij gewoon nog een nieuwe aan:
INSERT INTO invoice_usermeta (user_id, meta_key, meta_value) VALUES(4, 'nog_iets','value4') ON DUPLICATE KEY UPDATE meta_value='value4'

Hoe zorg ik er voor dat hij de juiste index aanspreekt?
Titel: Re: SQL insert value en anders update value
Bericht door: xvilo op december 30, 2015, 12:11:45 am
Okey,

Ik heb het nu wel zover werkend door de PRIMARY index te verwijderen dat als user_id, meta_key én meta_value het zelfde zijn hij ze update, maar anders maakt ie er blij nog eentje aan....
Ik gebruik nu `INSERT INTO invoice_usermeta (user_id, meta_key, meta_value) VALUES(4, 'nog_iets','svalue4') ON DUPLICATE KEY UPDATE meta_value=VALUES(meta_value)`