Ankündigung

Einklappen
Keine Ankündigung bisher.

MySQL: INSERT INTO oder UPDATE verknüpft in einem Query

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Gast-Avatar
    Ein Gast antwortete
    Zitat von thomas_w Beitrag anzeigen
    Bleibt vielleicht noch das Thema BEFORE UPDATE TRIGGER (BUT) und/oder Stored Procedures (SP)

    Der Ablauf wäre dann wie folgt:

    1. Einen UPDATE mit den neuen Daten ausführen. Dies aktiviert den BUT
    2. Findet der BUT mit Hilfe eines SELECT den PK macht er nichts und der UPDATE wird ausgeführt.
    3. Findet der BUT den PK nicht, erzeugt er einen INSERT.

    Wäre natürlich auch eine eigenes SP dafür sinnvoll.

    Mal als Idee...

    Grüße
    Thomas
    Hey,

    würde das ganze auf eine IF THEN Anweisung rauslaufen?
    Könntest du mir dann die richtige Syntax nennen? Ich google das Problem jetzt schon seit ner Stunde und alle queries die ich darüber finde geben mir Syntax Errors zurück.

    Meine IF THEN Anweisung wäre gewesen:

    Code:
    IF EXISTS(SELECT  * FROM table WHERE Attribut = attr_2 AND id=2)
    
        BEGIN
    
           UPDATE table SET val = val+5 WHERE Attribut = attr_2 
    
        END
    
        ELSE
    
        BEGIN
    
           INSERT INTO table (id, attribut, val) VALUES ('2','attr_2',5)
    
        END

    Funktioniert leider nicht:

    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF EXISTS(SELECT * FROM p_inv WHERE item = 5) BEGIN UPDATE p_i' at line 1
    (( Auch ohne BEGIN und END - ich bekomme keine IF THEN Anweisung hin, wenn THEN ein Query beinhält. ))

    Du kannst UPDATE und INSERT verwenden. Aber was hat das mit WHERE zu tun?
    Nochmal: Ich würde gerne in einem MySQL Query das genannte Problem lösen. Soll heißen, wenn z.B. die Zeile Attr_2 für ID 2 schon existiert soll er ein UPDATE des values für ID 2 Attr_2 ausführen.

    Wenn die Zeile noch nicht existiert soll er sie neu hinzufügen.

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    Du kannst UPDATE und INSERT verwenden. Aber was hat das mit WHERE zu tun?

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    Bleibt vielleicht noch das Thema BEFORE UPDATE TRIGGER (BUT) und/oder Stored Procedures (SP)

    Der Ablauf wäre dann wie folgt:

    1. Einen UPDATE mit den neuen Daten ausführen. Dies aktiviert den BUT
    2. Findet der BUT mit Hilfe eines SELECT den PK macht er nichts und der UPDATE wird ausgeführt.
    3. Findet der BUT den PK nicht, erzeugt er einen INSERT.

    Wäre natürlich auch eine eigenes SP dafür sinnvoll.

    Mal als Idee...

    Grüße
    Thomas

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    Hast du meinen ersten Post gelesen?

    Ich kann leider nicht mit REPLACE arbeiten. Würde ich z.B. für ID 1 das Attribut 2 um 5 erhöhen wollen würde das ganze so aussehen:

    REPLACE INTO table (`id`,`attr,`val`) VALUES (1,5,`val`+5)

    mit dem Ergebnis dass eine neue Zeile hinzukommt:

    Code:
    ID | attribute | val
    1    Attr_1        2
    1    Attr_2        5
    2    Attr_5        6
    2    Attr_8        1
    1    Attr_2        5
    Das erwünschte Ergebnis wäre jedoch:

    Code:
    ID | attribute | val
    1    Attr_1        2
    1    Attr_2        10
    2    Attr_5        6
    2    Attr_8        1
    Und mit dem Query gleicher Art für ID 2 (die Attr_2 noch nicht als Eintrag in der DB hat):

    Code:
    ID | attribute | val
    1    Attr_1        2
    1    Attr_2        10
    2    Attr_5        6
    2    Attr_8        1
    2    Attr_2        5

    ... nur für den Fall dass es überhaupt möglich ist und deswegen frage ich.

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    INSERT ja auch nicht. Wozu auch? Im Normalfall kann man im Vorfeld doch die Daten zusammenstellen, die man einfügen will.

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    Sorry meinte natürlich "REPLACE" nicht "REPLACEMENT".

    Problem: Meines Wissens nach kann ich REPLACE nicht mit "WHERE" verknüpfen, ist das korrekt?

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    Schau Dir mal "REPLACE" an.

    Code:
    REPLACE [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name [(col_name,...)]
    VALUES ({expr | DEFAULT},...),(...),...
    
    REPLACE funktioniert auf exakt gleiche Weise wie INSERT. Der Unterschied besteht darin, dass, wenn ein alter Datensatz
    denselben Wert wie ein neuer Datensatz für einen Primärschlüssel oder einen eindeutigen Index hat, der alte Datensatz gelöscht
    wird, bevor der neue eingefügt wird. Siehe auch Abschnitt 13.2.4,
    Grüße
    Thomas

    Einen Kommentar schreiben:

Lädt...
X