[MySQL 4.1] Multi-Delete löscht nicht!

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

  • [MySQL 4.1] Multi-Delete löscht nicht!

    Hi,

    Multi-Deletes wurden hier ja schon diskutiert.
    Ich hab nur aktuell ein Problem wozu ich keine Lösung finden kann.

    Ich lösche durch insgesamt 9 Tabellen Daten.

    Query (Bsp.):
    --------------------------
    DELETE
    t1, t2, t3, t4

    FROM
    blub AS t1,
    bla AS t2,
    blarb AS t3,
    hui AS t4

    WHERE
    t1.id = '6' AND
    t2.t1_id = t1.id AND

    t3.t2_id = t2.id AND
    t4.t2_id = t2.id
    --------------------------

    Das Problem ist jetzt, findet die Query in einer Tabelle keine passenden Daten vor (zB. t3 enthält keinen eintrag mit passender ID t2.id), löscht sie garnichts! Mit garnichts meine ich, das in keiner(!) der Tabellen etwas gelöscht wird.
    Sind in allen Tabellen entsprechende Datensätze funktioniert es anstandslos.

    Hat da irgendjemand ne Idee wodran das liegen könnte - hab ich irgendwas überlesen/vergessen.

    Erleuchtet mich !!


    mfg der-p

  • #2
    wenn du die Bedingungen mit AND verknüpft, wundert dich das?

    Kommentar


    • #3
      DOH!!!!

      Ok, habs korrigiert.

      Query:
      --------------
      DELETE
      t1, t2, t3, t4

      FROM
      blub AS t1,
      bla AS t2,
      blarb AS t3,
      hui AS t4

      WHERE
      t1.id = '6' OR
      t2.t1_id = t1.id OR

      t3.t2_id = t2.id OR
      t4.t2_id = t2.id
      -------------

      Leider immernoch 0 row(s) affected wenn in t4 kein Datensatz mit passender ID t2.id ist.

      Wenn ich mit OR dann ohne die letzte Bedingung DELETE wird leider jeder Eintrag in der DB gelöscht. War mit AND dann doch besser - hab glaube http://dev.mysql.com/doc/mysql/en/delete.html dann doch richtig interpretiert.
      Zuletzt geändert von prego; 13.05.2005, 10:43.

      Kommentar


      • #4
        ich würde sagen, du sollst dich etwas mehr mit logischen Operatoren und JOIN beschäftigen.

        Kommentar


        • #5
          Hi again,

          du hattest recht, ich hatte gedanklich den falschen Ansatz für den Join. Hier die funktionierende Lösung:

          query:
          -----------
          DELETE

          t1, t2, t3

          FROM blub AS t1

          LEFT JOIN
          bla AS t2
          ON(t1.id = t2.t1_id)

          LEFT JOIN
          hui AS t2
          ON(t1.id = t3.t1_id)

          /* und so weiter */

          WHERE
          t1.id = '6'
          -----------

          Alle Tabellen sind LEFT JOINs zu ihren Abhängigen Tabelle, da ich in der Ergebnissmenge ja auch Ergebnisse brauche, die nicht alle einen Eintrag in (zB) t3 haben.

          Trotzdem vielen Dank für deine Hilfe.

          Hab eben auch noch was über USING gelesen. Ich versteh nur nicht ganz, wie ich das dann formulieren muss.
          Kann mir da einer nen Tipp geben?

          edit: Query korrigiert...

          thnx - so long - der p
          Zuletzt geändert von prego; 13.05.2005, 12:18.

          Kommentar


          • #6
            Original geschrieben von prego

            Hab eben auch noch was über USING() gelesen. Ich versteh nur nicht ganz, wie ich das dann formulieren muss.
            Kann mir da einer nen Tipp geben?

            USING in UPDATE? Was ist denn hier nicht zu verstehen?
            mysql manual
            For the first syntax, only matching rows from the tables listed before the FROM clause are deleted. For the second syntax, only matching rows from the tables listed in the FROM clause (before the USING clause) are deleted. The effect is that you can delete rows from many tables at the same time and also have additional tables that are used for searching:

            DELETE t1, t2 FROM t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;

            Or:

            DELETE FROM t1, t2 USING t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;

            These statements use all three files when searching for rows to delete, but delete matching rows only from tables t1 and t2.

            Kommentar


            • #7
              Hmm,

              danke für den Hinweis, nur mit dem LEFT JOIN Beispiel funktioniert das nicht mehr...

              Also:
              --------------
              DELETE

              t1, t2, t3

              USING blub AS t1

              LEFT JOIN
              bla AS t2
              ON(t1.id = t2.t1_id)

              LEFT JOIN
              hui AS t2
              ON(t1.id = t3.t1_id)

              /* und so weiter */

              WHERE
              t1.id = '6'
              --------------

              Error: 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 'USING tarif_provider AS provider'



              Ist aber auch nicht schlimm, das war jetzt nur ne rein interessehalber Frage. Oder hab ich dadurch irgendwelche Vorteile?

              Danke für die Mühe.

              so long - der p

              Kommentar


              • #8
                du kannst entweder USING oder JOIN verwenden, beides geht nicht. Bitte lesen: http://dev.mysql.com/doc/mysql/en/delete.html

                Kommentar


                • #9
                  Ok, danke für die Hilfe.

                  so long - der p

                  Kommentar

                  Lädt...
                  X