Lukas.: mysql update: Array der betroffenen Zeilen?

Hallo,

gibt es die Möglichkeit, bei einem update-Query ein Array der betroffenen Zeilen zu erhalten?

Lukas

  1. Tach!

    gibt es die Möglichkeit, bei einem update-Query ein Array der betroffenen Zeilen zu erhalten?

    Wenn ich einen solchen Wunsch habe, gehe ich so vor: Geh ins MySQL-Handbuch zur Seite des UPDATE-Statements. Ist da eine solche Funktionalität erwähnt? Wenn ja, geh ins PHP-Handbuch und schau nach, ob es eine entsprechende Funktion gibt. Oder: geh ins PHP-Handbuch und schau ob eine solche Funktionalität in der Funktionsbeschreibung dokumentiert ist. Auch die Userkommentare können Auskunft geben, mitunter über Alternativen.

    dedlfix.

    1. Hi,

      Wenn ich einen solchen Wunsch habe, gehe ich so vor: Geh ins MySQL-Handbuch zur Seite des UPDATE-Statements. Ist da eine solche Funktionalität erwähnt? Wenn ja, geh ins PHP-Handbuch und schau nach, ob es eine entsprechende Funktion gibt. Oder: geh ins PHP-Handbuch und schau ob eine solche Funktionalität in der Funktionsbeschreibung dokumentiert ist. Auch die Userkommentare können Auskunft geben, mitunter über Alternativen.

      Na, aber dann braucb ich ggf. eine bis zwei Stunden, um zu erkennen, dass es da nichts gibt, nicht weil es tatsächlich nichts gäbe, sondern weil ich zu doof war (respektive zu schlecht englisch spreche), es zu finden.

      Egal, muß ich mir halt anders helfen, trotzdem danke.

      Lukas

  2. Hallo und guten Morgen,

    gibt es die Möglichkeit, bei einem update-Query ein Array der betroffenen Zeilen zu erhalten?

    Ich nehme jetzt mal mySQL als DBMS an.

    Da kenne ich von Haus aus keine Möglichkeit. Aber Du kannst eine eigene Möglichkeit einbauen: Baue Dir einen Trigger, der in einer History-Tabelle die (unique) Statementnummer und die ID der Zeile abspeichert. Dann kannst Du anschließend

    Table STATEMENT
    id bigint unique autoincrement
    stmt varchar (255)
    timeofcall timestamp

    Table STATEMNET_CALLS
    id_statement bigint
    id_record bigint
    tablename varchar

    Grüße
    TS

    --
    es wachse der Freifunk
    http://freifunk-oberharz.de
    1. Hi TS,

      Da kenne ich von Haus aus keine Möglichkeit. Aber Du kannst eine eigene Möglichkeit einbauen: Baue Dir einen Trigger, der in einer History-Tabelle die (unique) Statementnummer und die ID der Zeile abspeichert. Dann kannst Du anschließend

      Table STATEMENT
      id bigint unique autoincrement
      stmt varchar (255)
      timeofcall timestamp

      Table STATEMNET_CALLS
      id_statement bigint
      id_record bigint
      tablename varchar

      Mit Triggern kenne ich mich noch gar nicht aus, die werde ich mir mal zu Gemüte führen müssen. Danke für den Tip.

      Lukas

      1. Hallo und guten Morgen Lukas,

        Mit Triggern kenne ich mich noch gar nicht aus, die werde ich mir mal zu Gemüte führen müssen. Danke für den Tip.

        um zu üben und etwas schneller arbeiten zu können habe ich mir zu meinem XAMPP-System noch Heidi-SQL installiert. Ist kostenlos und ein wirklich schickes GUI für MySQL.

        Da kannst Du dann die Sgtatements, Trigger, Tabellen usw. zusammenbauen und lässt sie dir dann im Befehlstext (Create-Statements usw.) anzeuigen.

        Und ja, es gibt noch mehr praktische Tools ...

        Grüße
        TS

        --
        es wachse der Freifunk
        http://freifunk-oberharz.de
  3. Hallo Lukas.,

    gibt es die Möglichkeit, bei einem update-Query ein Array der betroffenen Zeilen zu erhalten?

    Du kannst vorher ein entsprechendes SELECT ausführen.

    Bis demnächst
    Matthias

    --
    Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
    1. Hallo und guten Morgen,

      gibt es die Möglichkeit, bei einem update-Query ein Array der betroffenen Zeilen zu erhalten?

      Du kannst vorher ein entsprechendes SELECT ausführen.

      Das ist schon wieder eine andere Baustelle. Vorher gucken schadet nie und dann aber eine Temp-Table mit den IDs erstellen und das eigentliche Update über ein Join mit diesem Temp-Table fahren.

      Alternative eben Transaction einleiten und Logbuch schreiben, wie beschrieben in Posting

      Grüße
      TS

      --
      es wachse der Freifunk
      http://freifunk-oberharz.de
    2. Hi Matthias,

      gibt es die Möglichkeit, bei einem update-Query ein Array der betroffenen Zeilen zu erhalten?

      Du kannst vorher ein entsprechendes SELECT ausführen.

      Ja, genau das wollte ich in eoinem Schritt machen ;) Aber ok, solange ich nicht triggern kann (wie von TS vorgeschlagen), werde ich wohl so vorgehen. Danke, Lukas

      1. Hallo Lukas.,

        gibt es die Möglichkeit, bei einem update-Query ein Array der betroffenen Zeilen zu erhalten?

        Du kannst vorher ein entsprechendes SELECT ausführen.

        Ja, genau das wollte ich in eoinem Schritt machen ;) Aber ok, solange ich nicht triggern kann (wie von TS vorgeschlagen), werde ich wohl so vorgehen.

        Nicht vergessen, dieser Weg ist nur sicher, wenn du einerseits innerhalb einer Transaktion arbeitest und zweitens mit SELECT ... FOR UPDATE arbeitest. Ansonsten kann dir das aufgrund von Concurrency um die Ohren fliegen.

        LG,
        CK

        1. Hallo und guten Morgen CK,

          Nicht vergessen, dieser Weg ist nur sicher, wenn du einerseits innerhalb einer Transaktion arbeitest und zweitens mit SELECT ... FOR UPDATE arbeitest. Ansonsten kann dir das aufgrund von Concurrency um die Ohren fliegen.

          Ich nehme an, dass es das wieder nur für InnoDB gibt und nicht für MyISAM?

          Grüße
          TS

          --
          es wachse der Freifunk
          http://freifunk-oberharz.de
          1. Hallo TS,

            Nicht vergessen, dieser Weg ist nur sicher, wenn du einerseits innerhalb einer Transaktion arbeitest und zweitens mit SELECT ... FOR UPDATE arbeitest. Ansonsten kann dir das aufgrund von Concurrency um die Ohren fliegen.

            Ich nehme an, dass es das wieder nur für InnoDB gibt und nicht für MyISAM?

            MyISAM kann gar nichts und sollte auch nicht verwendet werden, wenn dir deine Daten lieb sind. Du nimmst also richtig an.

            LG,
            CK

      2. Hallo Lukas,

        Ja, genau das wollte ich in eoinem Schritt machen ;) Aber ok, solange ich nicht triggern kann (wie von TS vorgeschlagen), werde ich wohl so vorgehen.

        Das sind aber zwei verschiwedene Schuhe:

        • vorheriges Select schützt vor bösen Überraschungen
        • Triggern und nachheriges Listen zeigt die tatsächlich veränderten Datensäte an. Dann kann es aber schon zu spät sein

        Aber wenn Du vorher selectest, musst Du der Ordnung halber die Tabelle vom vor dem Select bis nach dem Update gegen Veränderungen durch Andere sperren. Sonst bekommst Du ein "TOCTTOU-Problem".

        Grüße
        TS

        --
        es wachse der Freifunk
        http://freifunk-oberharz.de
        1. Hi Ts (und auch Matthias),

          Aber wenn Du vorher selectest, musst Du der Ordnung halber die Tabelle vom vor dem Select bis nach dem Update gegen Veränderungen durch Andere sperren. Sonst bekommst Du ein "TOCTTOU-Problem".

          Ja, das ist mir bewußt. Danke trotzudem für den Hinweis.

          L.