Prom: Prüfen ob Änderung besteht vor UPDATE

Hallo,

bevor ich ein UPDATE in der Datenbank ausführe (der SQL wurde per PHP dynamisch zusammengesetzt), möchte ich prüfen, ob der Update überhaupt eien Änderung in der Datenbank bewirkt, ergo ob der hinzuzufügende Wert den bereits existierenden Wert deckt.
Wie kann ich das am performantesten und flexibelsten machen? Die Anzahl der Felder sind variabel. Außerdem möchte ich nicht unbedingt für jeden UPDATE zuerst einen SELECT auszuführen müssen um auf Änderungen prüfen zu können.

Gruß
Prom

  1. Hallo Prom,

    bevor ich ein UPDATE in der Datenbank ausführe (der SQL wurde per PHP dynamisch zusammengesetzt), möchte ich prüfen, ob der Update überhaupt eien Änderung in der Datenbank bewirkt, ergo ob der hinzuzufügende Wert den bereits existierenden Wert deckt.
    Wie kann ich das am performantesten und flexibelsten machen? Die Anzahl der Felder sind variabel. Außerdem möchte ich nicht unbedingt für jeden UPDATE zuerst einen SELECT auszuführen müssen um auf Änderungen prüfen zu können.

    Warum? Dann lässt es sich leichter helfen. ;)

    Ich vermute du suchst so einen Weg, weil du nicht weiß, ob es ein INSERT oder ein UPDATE werden soll!? Wenn ja, dafür gibt eine Lösung:

    INSERT [...] ON DUPLICATE KEY UPDATE

    Heißt, wenn der Insert fehlschlägt, weil es einen Eintrag bereits gibt, dann mache ein Update.

    War es das?

    ciao
    romy

    1. Hallo romy,

      Ich vermute du suchst so einen Weg, weil du nicht weiß, ob es ein INSERT oder ein UPDATE werden soll!? Wenn ja, dafür gibt eine Lösung:

      War es das?

      Nein, es geht rein um UPDATE. Ich biete unseren Vereinsmitgliedern die Möglichkeit, ihre Profilseite auf unserer Vereinsseite zu bearbeiten (Hobbies, Erfolge, Lieblingsgericht etc...). Diese Einträge stehen in einer Datenbank und ich möchte den Server nicht unnötig mit UPDATES belasten, die nicht nötig sind.

      Grüße
      Prom

      1. Hallo,

        Ich biete unseren Vereinsmitgliedern die Möglichkeit, ihre Profilseite auf unserer Vereinsseite zu bearbeiten (Hobbies, Erfolge, Lieblingsgericht etc...). Diese Einträge stehen in einer Datenbank und ich möchte den Server nicht unnötig mit UPDATES belasten, die nicht nötig sind.

        wenn du das wirklich tun willst, wirst du wohl die aus der Datenbank gelesenen Daten zwischenspeichern müssen (z.B. in einer Session), und vor dem Update die vom CLient zurückgelieferten Daten mit den in der Session gespeicherten vergleichen.

        Aber ich halte das ehrlich gesagt für übertrieben. Wenn der Datenbankserver dann und wann mal ein UPDATE machen soll, auch wenn's vielleicht unnötig ist, dürfte das die Performance kaum merklich beeinträchtigen. Oder greifen Tausende von Mitgliedern nahezu gleichzeitig auf ihr Profil zu?

        So long,
         Martin

        --
        Alleine sind wir stark ...
        gemeinsam sind wir unausstehlich!
        1. Hi

          Oder greifen Tausende von Mitgliedern nahezu gleichzeitig auf ihr Profil zu?

          Nein, aber da ich ein vorausschauend denkender Programmierer bin, der alles haarklein richtig und gut machen will, fühle ich mich dazu gezwungen :)
          Gibt es nicht die Möglichkeit, MySQL zu sagen, dass der Update nur ausgeführt werden soll wenn Änderungen bestehen (UPDATE_ON_CHANGE oder sowas in der Art hatte ich mir vorgestellt).

          MfG
          Prom

          1. Hallo,

            Gibt es nicht die Möglichkeit, MySQL zu sagen, dass der Update nur ausgeführt werden soll wenn Änderungen bestehen (UPDATE_ON_CHANGE oder sowas in der Art hatte ich mir vorgestellt).

            nicht dass ich wüsste - und es ergäbe meiner Ansicht nach auch keinen Sinn. Denn die eigentlich aufwendige "Arbeit", nämlich das Suchen des richtigen Datensatzes (was die Auswertung aller Auswahlkriterien und eventuelle JOINs einschließt), fällt dabei auch an. Ob die Felder nun, nachdem der Datensatz einmal gefunden ist, auch noch aktualisiert werden, fällt vermutlich kaum ins Gewicht.

            Ciao,
             Martin

            --
            Ich stehe eigentlich gern früh auf.
            Außer morgens.
  2. Mahlzeit Prom,

    bevor ich ein UPDATE in der Datenbank ausführe (der SQL wurde per PHP dynamisch zusammengesetzt), möchte ich prüfen, ob der Update überhaupt eien Änderung in der Datenbank bewirkt, ergo ob der hinzuzufügende Wert den bereits existierenden Wert deckt.

    Alternative: öffne eine Transaktion, führe das UPDATE durch, überprüfe mit mysql_affected_rows(), ob die Änderung sich überhaupt ausgewirkt hat, und wenn nicht, drehst Du die Transaktion wieder zurück.

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. Hi!

      Alternative: öffne eine Transaktion, führe das UPDATE durch, überprüfe mit mysql_affected_rows(), ob die Änderung sich überhaupt ausgewirkt hat, und wenn nicht, drehst Du die Transaktion wieder zurück.

      Wenn sich nichts geändert hat, muss auch nichts "zurückgedreht" werden. Eine Transaktion ist ja noch aufwendiger als ein UPDATE, bei dem der alte Wert durch einen gleichlautenden neuen Wert überschrieben werden würde (was bei MySQL nicht passiert).

      Lo!

    2. Hi EKKi,

      öffne eine Transaktion, führe das UPDATE durch, überprüfe mit mysql_affected_rows(), ob die Änderung sich überhaupt ausgewirkt hat, und wenn nicht, drehst Du die Transaktion wieder zurück.

      geht mir oft beim Arbeiten so: Am Ende des Tages wuerde ich gerne rueckgaengig machen, nichts getan zu haben. ;-)

      „Durch Bierhoffs Einwechslung hat sich nichts geändert. Im Gegenteil.“ (Béla Réthy)

      Viele Gruesse,
      der Bademeister

  3. Hi!

    Ich gehe mal von MySQL aus. Es ist immer besser, auch bei solch anscheinend generischen Fragen das verwendete DBMS anzugeben, damit man dessen Eigenheiten berücksichtigen kann. Auch ob ein DB-Access-Layer verwendet wird ist wichtig, denn der entscheidet manchmal über die Nutzbarkeit spezieller Features des jeweiligen DBMS.

    bevor ich ein UPDATE in der Datenbank ausführe (der SQL wurde per PHP dynamisch zusammengesetzt), möchte ich prüfen, ob der Update überhaupt eien Änderung in der Datenbank bewirkt, ergo ob der hinzuzufügende Wert den bereits existierenden Wert deckt.

    Ohne eine Kommunikation mit dem DBMS wirst du das nicht rausfinden können, denn zwischen Lesen und Schreiben des einen Benutzers können andere Vorgänge die Daten geändert haben. Der Aufwand der Kommunikation bleibt also in jedem Fall.

    Wie kann ich das am performantesten und flexibelsten machen? Die Anzahl der Felder sind variabel. Außerdem möchte ich nicht unbedingt für jeden UPDATE zuerst einen SELECT auszuführen müssen um auf Änderungen prüfen zu können.

    MySQL ist so klug und verzichtet von selbst auf den Schreibvorgang, wenn es nichts zu ändern gibt.

    Siehe mysql_affected_rows() im Abschnitt Return Values.
    Siehe mysqli::real_connect() Flag MYSQLI_CLIENT_FOUND_ROWS.

    Wichtiger als ein UPDATE einzusparen, ist jedoch, sich über konkurrierenden Änderungen Gedanken zu machen.

    Lo!