Bernd: Löschen von Einträge die nicht gleich sind

Hallo und guten morgen,

kann ich direkt in einer MySQL Tabelle folgendes ausführen?

  1. Gehe in Tabelle 1 und hole dir nach und nach alle Datensätze
  2. Gehe in Tabelle 2 und schau ob dieser Datensatz dort existiert
  3. Wenn nein lösch diesen Datensatz aus Tabelle 1
  4. Wenn ja mach nichts und gehe zum nächsten.

Oder muss ich mir dafür ein PHP Script schreiben?

  1. Tach!

    kann ich direkt in einer MySQL Tabelle folgendes ausführen?

    1. Gehe in Tabelle 1 und hole dir nach und nach alle Datensätze
    2. Gehe in Tabelle 2 und schau ob dieser Datensatz dort existiert
    3. Wenn nein lösch diesen Datensatz aus Tabelle 1
    4. Wenn ja mach nichts und gehe zum nächsten.

    Liest sich nach einem Ablauf und einen solchen könnte man als Stored Procedure ins DBMS schreiben oder auch in der Anwendung ausführen.

    Andererseits muss man das bei dieser Aufgabenstellung nicht, denn man kann es auch als Statement formulieren.

    Zum Testen am besten erstmal SELECT statt DELETE nehmen. Für Schritt 1 reicht ein einfaches Statement SELECT * FROM t1. Für Schritt 2 kann man eine Subquery mit NOT EXISTS hinzufügen.

    SELECT * FROM t1 WHERE NOT EXISTS (SELECT * FROM t2 WHERE t1.id = t2.id)
    

    Das war es im Grunde schon. Schritt 4 braucht es bei diesem mengenorientierten Ansatz nicht. Wenn die Query die gesuchten Datensaätze ergibt, kannst du sie in ein DELETE-Statement umformulieren. Vielleicht wirst du noch das Vergleichskriterium anpassen müssen, wenn sich die Datensätze in deinem Fall nicht anhand der ID als gleich erkennen lassen. Bedenke dabei, das gelöschte IDs aus t1 wiedervergeben worden sein könnten, der Datensatz aber ansonsten nicht mehr dem von t2 entspricht.

    dedlfix.

    1. Hallo,

      danke für deine Erklärung. Hab es nun so gemacht

      DELETE FROM produkte 
      WHERE NOT EXISTS (SELECT * FROM produkte_import WHERE produkte.artnr = produkte_import.Nr)
      
      1. Hello,

        danke für deine Erklärung. Hab es nun so gemacht

        DELETE FROM produkte 
        WHERE NOT EXISTS (SELECT * FROM produkte_import WHERE produkte.artnr = produkte_import.Nr)
        

        Ich hätte noch gefragt: definiere "gleich".
        Und dann könntest Du mit einem delayed delete (-> manual) arbeiten, damit der Index nicht nach jedeR Row neu aufgebaut wird, sondern erst am Ende.

        Glück Auf
        Tom vom Berg

        --
        Es gibt nichts Gutes, außer man tut es!
        Das Leben selbst ist der Sinn.
        1. Hallo TS,

          meinst Du das hier:

          If you specify the LOW_PRIORITY modifier, the server delays execution of the DELETE until no other clients are reading from the table. This affects only storage engines that use only table-level locking (such as MyISAM, MEMORY, and MERGE).

          Das hat aber nichts mit Reindex nach jeder Zeile zu tun, oder?

          Rolf

          --
          sumpsi - posui - clusi
          1. Hello,

            meinst Du das hier:

            If you specify the LOW_PRIORITY modifier, the server delays execution of the DELETE until no other clients are reading from the table. This affects only storage engines that use only table-level locking (such as MyISAM, MEMORY, and MERGE).

            Das hat aber nichts mit Reindex nach jeder Zeile zu tun, oder?

            Stimmt. Da hab ich mich wohl geirrt. Aber da war mal was... Ich finds nicht.

            Delayed Reindex. Hatte bei mir damals einen enormen Unterschied (Verringerung) in der Laufzeit verursacht.

            Vielleicht finde ichs ja doch noch wieder. Ist ja wahrscheinlich nur spannend, wenn man sowas wiederholt vornehmen muss.

            Glück Auf
            Tom vom Berg

            --
            Es gibt nichts Gutes, außer man tut es!
            Das Leben selbst ist der Sinn.