INSERT-Query mit Bezug auf Spalte

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

  • INSERT-Query mit Bezug auf Spalte

    Ich bastle mit NestedSets herum und möchte gerne einen neuen Knoten einfügen. Ein Baum besitzt bei mir mehrere Wurzeln, d.h. der neue Knoten soll als neue Wurzel angelegt werden. Das heißt, der linke Wert des neuen Knotens besitzt den Wert MAX(rgt)+1, der rechte Wert MAX(rgt)+2. Das kann ich auch ganz fein in einer INSERT-Query mit Subselect verpacken und sieht dann zum Beispiel so aus:
    Code:
    insert into nodes set
      lft=(select max(rgt) from nodes as n)+1,
      rgt=(select max(rgt) from nodes as n)+2,
      data=...
    Das ist soweit in Ordnung und klappt auch wunderbar.
    Die Frage ist jetzt, muss ich an dieser Stelle wirklich zwei Subselects nutzen, oder kann ich den Wert für rgt nicht direkt auf lft+1 setzen. Ich habe das in MySQL getestet und das klappt, wenn ich erst lft und anschließend rgt setze, d.h. die Reihenfolge ist entscheidend. Gilt dies denn immer? Im Grunde fehlt mir nur das kleine Schnippselchen Dokumentation, welches mir sagt, dass die Auswertungsreihenfolge immer von links nach rechts ist und rgt definitiv den Wert lft+1 annimmt.
    Kann mir da jemand von den SQL-Profis etwas mehr zu sagen?

  • #2
    Hallo,

    mit INSERT ... SELECT kannst du das ganz ohne Subselects lösen:

    Code:
    insert into nodes (lft, rgt)
    select max(rgt) + 1, max(rgt) + 2
    from nodes;
    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Da hast du recht, auch eine nette alternative. Ich nutze die Zend_Db-Klassen und würde da gerne direkt die insert-Methode nutzen, gegen das Subselect habe ich also nichts. Weißt du, ob die Ausführungsreihenfolge der Query immer von links nach rechts ist?

      Kommentar


      • #4
        Zitat von PHP-Desaster Beitrag anzeigen
        Weißt du, ob die Ausführungsreihenfolge der Query immer von links nach rechts ist?
        Das kann ich dir leider nicht sagen und selbst wenn, wüsste ich nicht, ob das in der nächsten Version noch genau so ist.

        Wenn dir das INSERT ... SELECT nicht zusagt, könntest du immer noch einen BEFORE INSERT Trigger definieren, der NEW.rgt auf NEW.lft + 1 setzt und im INSERT-Statement nur lft setzen.
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          Ich habe mir das jetzt länger durch den Kopf gehen lassen und werde bei meiner jetzigen Lösung mit den zwei Subselects bleiben. Ein Trigger ist mir für den Spezialfall "Hinzufügen einer neuen Wurzel" zu viel tamtam und mich auf die Ausführungsreihenfolge verlassen ist zu naiv. Vielen Dank für deine Alternativvorschläge

          Kommentar

          Lädt...
          X