heinetz: MySQL 5

Hallo Forum,

ich sthe grad auf'm Schlauch …

Ich habe in einer DB Tabelle Datensätze. Alle haben u.A. ein Feld [primarykey/AUTO_INCREMENT] ID, ein Feld DOC_ID und weitere Felder. Mich interessieren 5 Datensätze, die die selbe DOC_ID haben. Es sind bspw. 5 Datensätze mit der DOC_ID=3 in der Tabelle. Die hole ich mit einem SELECT heraus, bearbeite sie und will sie wieder abspeichern. Das bearbeiten kann aber auch bedeuten, dass ich einen dieser 5 Datensätze löschen, oder ich bspw. bei Editieren die Reihenfolge der 5 untereinander ändern möchte.

Da das Feld ID keine Rolle spielt, könnte man das in zwei Schritten lösen:

  1. DELETE FROM tbl_name WHERE DOC_ID=3
  2. INSERT INTO tbl_name (DOC_ID, label, value) VALUES(3,'a',1),(3,'b',2),(3,'c',3)

Damit würden 5 Datensätze gelöscht und danach 3 eingefügt. Die bekämen zwar eine neue ID, Aber die interessiert mich ja eh nicht.

Geht das auch mit einem SQL-Statement wie REPLACE?

danke und

beste gruesse, heinetz

  1. Hallo

    Ich habe in einer DB Tabelle Datensätze. Alle haben u.A. ein Feld [primarykey/AUTO_INCREMENT] ID, ein Feld DOC_ID und weitere Felder. Mich interessieren 5 Datensätze, die die selbe DOC_ID haben. Es sind bspw. 5 Datensätze mit der DOC_ID=3 in der Tabelle. Die hole ich mit einem SELECT heraus, bearbeite sie und will sie wieder abspeichern. Das bearbeiten kann aber auch bedeuten, dass ich einen dieser 5 Datensätze löschen, oder ich bspw. bei Editieren die Reihenfolge der 5 untereinander ändern möchte.

    Da das Feld ID keine Rolle spielt, könnte man das in zwei Schritten lösen:

    1. DELETE FROM tbl_name WHERE DOC_ID=3
    2. INSERT INTO tbl_name (DOC_ID, label, value) VALUES(3,'a',1),(3,'b',2),(3,'c',3)

    Damit würden 5 Datensätze gelöscht und danach 3 eingefügt. Die bekämen zwar eine neue ID, Aber die interessiert mich ja eh nicht.

    Mit Hilfe des Feldes ID, welches einen Datensatz identifizieren soll, geht das auch in einem Schritt. Was hindert dich daran, die ID mit auszulesen und die Datensätze anhand dieser ID mit einem UPDATE bzw. DELETE zu behandeln? So, wie du das beschreibst, klingt das für mich wie von hinten durch die Brust ins Auge.

    Tschö, Auge

    --
    Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war. Terry Pratchett, "Wachen! Wachen!" ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
    1. ... durch die Brust ins Auge.

      ;)

      In meinem Beispiel wären das dann 3 Updates und ein Delete. In einem anderen Beispiel können aus den 5 Datensätzen mit der selben DOC_ID 6 mit der selben DOC_ID werden. Das wären dann 5 Updates und ein Insert. Aber in beiden Fällen wüsste ich nicht, wie das in einem Schritt, bzw. mit einem SQL-Statement gehen soll.

      gruss, heinetz

      1. Hallo

        In meinem Beispiel wären das dann 3 Updates und ein Delete. In einem anderen Beispiel können aus den 5 Datensätzen mit der selben DOC_ID 6 mit der selben DOC_ID werden. Das wären dann 5 Updates und ein Insert. Aber in beiden Fällen wüsste ich nicht, wie das in einem Schritt, bzw. mit einem SQL-Statement gehen soll.

        Das weiß wohl keiner. Du kannst in einem Statement nicht sowohl Datensätze editieren als auch löschen. Was aber geht, ist das editieren und anlegen neuer Datensätze. Das geht in MySQL mit ON DUPLICATE KEY UPDATE. Angenommen, das Feld „name“ ist ein UNIQUE-Index, jeder Name darf also nur einmal auftauchen.

        $query = "INSERT INTO table
          datum = '" . mysql_real_escape_string($_POST["datum"]) . "',
          name = '" . mysql_real_escape_string($_POST["name"]) . "',
          irgendwas = '" . mysql_real_escape_string($_POST["bla"]) . "',
          aufrufe = 1
        ON DUPLICATE KEY UPDATE
          datum = NOW(),
          irgendwas = '" . mysql_real_escape_string($_POST["bla"]) . "',
          aufrufe = aufrufe + 1";
        

        Wenn du mehrere Datensätze auf einmal anfässt, wie machst du das? Wird auf der Auswertungsseite eine Schleife angestoßen?

        Tschö, Auge

        --
        Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war. Terry Pratchett, "Wachen! Wachen!" ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
  2. Moin.

    Wenn Du die Daten in der Tabelle nach einer bestimmten Eigenschaft sortieren willst, dann gib diese Eigenschaft in einer eigenen Spalte an.

    Diese Eigenschaft ist nicht die ID des Datensatzes, welche Du später mit guter Wahrscheinlichkeit mal brauchst um Abhängigkeiten der Datensätze in verschiedenen Tabellen oder gar Datenbanken untereinander zu regeln.

    Deshalb verbietet sich das Löschen und neu Anlegen.

    Also, wen ein inhaltliches Update benötigt wird, dann mache das Update. Willst Du Datensätze anhängen - dann mache das auch - mit insert. Willst Du Datensätze löschen, dafür gibt es dann delete. Und falls Dir nicht gefällt, dass Deine Änderungen zwischenzeitlich in anderen Sitzungen (Verbindungen) abrufbar sind, dann lese über Transaktionen und commit nach.

    Jörg Reinholz

  3. Moin

    Da das Feld ID keine Rolle spielt, könnte man das in zwei Schritten lösen:

    1. DELETE FROM tbl_name WHERE DOC_ID=3
    2. INSERT INTO tbl_name (DOC_ID, label, value) VALUES(3,'a',1),(3,'b',2),(3,'c',3)

    nach was entscheidest du welche Datensätze gelöscht werden und welche nicht?

    Gruß Bobby

    --
    -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <- ### Henry L. Mencken ### -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <- ### Viktor Frankl ### ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
    1. nach was entscheidest du welche Datensätze gelöscht werden und welche nicht?

      Gruß Bobby

      Ich lese alle Datensätze mit DOC_ID =3 (das sind bspw. 3) aus und stelle Sie im Frontend innerhalb eines Forms dar. Der User kann nun ... a) die Werte dieser Felder editieren b) neue Felder hinzufügen c) ein oder mehrere dieser Felder löschen ... oder a,b und c kombinieren...

      Dann schickt er das Formular ab und ich muss die Änderungen in die DB schreiben. Um nicht herausfinden zu müssen, was der User gemacht hat und dann entsprechend unterschiedlich damit umgehen zu müssen, würde ich folgendes machen:

      Zuerst alle Datensätze mit DOC_ID =3 löschen und alle, die nach dem Absenden des Forms IN GET bzw POST ankommen mit DOC_ID=3 einfügen.

      Das passt unabhängig davon, ob der User a, b oder c gemacht hat in jedem Fall.

      gruss, heinetz

      1. Moin

        Ich lese alle Datensätze mit DOC_ID =3 (das sind bspw. 3) aus und stelle Sie im Frontend innerhalb eines Forms dar. Der User kann nun ... a) die Werte dieser Felder editieren b) neue Felder hinzufügen c) ein oder mehrere dieser Felder löschen ... oder a,b und c kombinieren...

        Dann schickt er das Formular ab und ich muss die Änderungen in die DB schreiben. Um nicht herausfinden zu müssen, was der User gemacht hat und dann entsprechend unterschiedlich damit umgehen zu müssen, würde ich folgendes machen:

        Zuerst alle Datensätze mit DOC_ID =3 löschen und alle, die nach dem Absenden des Forms IN GET bzw POST ankommen mit DOC_ID=3 einfügen.

        Das passt unabhängig davon, ob der User a, b oder c gemacht hat in jedem Fall.

        Ah ok... das ist in meinen Augen Aufgabe der Programmlogik und nicht der Datenbank. Ich halte die Lösung mit dem Löschen und neu Eintragen nicht für angemessen... zumindest delete und update/insert würde ich trennen... bei insert kann man über duplicate entry update ein update statt insert für doppelte Einträge erzwingen...

        Gruß Bobby

        --
        -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <- ### Henry L. Mencken ### -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <- ### Viktor Frankl ### ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
      2. Tach!

        Um nicht herausfinden zu müssen, was der User gemacht hat und dann entsprechend unterschiedlich damit umgehen zu müssen, würde ich folgendes machen: Zuerst alle Datensätze mit DOC_ID =3 löschen und alle, die nach dem Absenden des Forms IN GET bzw POST ankommen mit DOC_ID=3 einfügen. Das passt unabhängig davon, ob der User a, b oder c gemacht hat in jedem Fall.

        Das sieht mir auch nach der einfachsten Lösung aus. Aus der Nutzerhandlung ein Delta zu ermitteln, ist aufwendig und bringt neue potentielle Fehlerquellen, auf jeden Fall aber mehr Code, der zu warten ist. Dass die IDs als Primärschlüssel verlorengehen ist für den Anwendungsfall nach deiner Schilderung belanglos. Dieses Feld wäre sogar ganz verzichtbar. Wenn du es noch nicht hast, wäre ein Feld mit einer Sortierreihenfolge sinnvoll, denn MySQL garantiert keine physische Reihenfolge in der Datenbank oder dass die Datensätze in einer bestimmten Folge in der Ergebnismenge stehen, wenn kein ORDER BY angegeben wurde. - Zur ursprünglichen Frage: mir ist keine Zusammenfassungsmöglichkeit bekannt, die ich in dem Fall verwenden würde.

        dedlfix.

        1. hi,

          Wenn du es noch nicht hast, wäre ein Feld mit einer Sortierreihenfolge sinnvoll …

          ja, ich weiss nicht wie man das ("SET @i = 0;"/"(@i:=@i+1)") nennt aber zu meiner Verwunderung funktioniert es auch in einem multiple INSERT-Statement.

          gruss, heinetz