Auteur Topic: SQL insert value en anders update value  (gelezen 2519 keer)

0 leden en 1 gast bekijken dit topic.

xvilo

  • Global Moderator
  • Verslaafd DigitalPlace Lid
  • *****
  • Berichten: 2675
  • Karma: -44
    • Bekijk profiel
    • http://www.xvilo.com
SQL insert value en anders update value
« Gepost op: december 29, 2015, 11:18:04 pm »
  • [+1]0
  • [-1]0
  • 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
    « Laatst bewerkt op: december 29, 2015, 11:19:47 pm door xvilo »


    Buzzer

    • Ex-Moderator
    • Actief DigitalPlace Lid
    • **
    • Berichten: 853
    • Karma: 13
    • Nodeïst
      • Bekijk profiel
      • http://infamous-irc.com
    Re: SQL insert value en anders update value
    « Reactie #1 Gepost op: december 29, 2015, 11:29:51 pm »
  • [+1]0
  • [-1]0
  • 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
    « Laatst bewerkt op: december 29, 2015, 11:33:25 pm door Buzzer »

    グーグル翻訳はうまく翻訳できませんので、グーグル翻訳使用してこの文章を翻訳しないでください。また、任天堂は最高です。

    xvilo

    • Global Moderator
    • Verslaafd DigitalPlace Lid
    • *****
    • Berichten: 2675
    • Karma: -44
      • Bekijk profiel
      • http://www.xvilo.com
    Re: SQL insert value en anders update value
    « Reactie #2 Gepost op: december 29, 2015, 11:46:41 pm »
  • [+1]0
  • [-1]0
  • 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?


    xvilo

    • Global Moderator
    • Verslaafd DigitalPlace Lid
    • *****
    • Berichten: 2675
    • Karma: -44
      • Bekijk profiel
      • http://www.xvilo.com
    Re: SQL insert value en anders update value
    « Reactie #3 Gepost op: december 30, 2015, 12:11:45 am »
  • [+1]0
  • [-1]0
  • 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)`