dolflyer: Einfache SQL-Abfrage

Hallo!!

Ich möchte mehrere Datensätze anhand der ID aus einem Table einer mySQL-Datenbank löschen.

Ich hab das für einen Datensatz so gemacht, aber wie geht das, wenn ich jetzt von ID X bis ID Y löschen möchte?

DELETE FROM visits WHERE id = '44' LIMIT 1;

Kann mir jemand helfen?

  1. Hallo!

    wenn ich jetzt von ID X bis ID Y löschen möchte?

    DELETE FROM visits WHERE id = '44' LIMIT 1;

    Alle Datensatätze mit der id zwischen 44 und 55.

    DELETE FROM visits WHERE id>=44 AND id<=55;

    MfG, André Laugks
    L-Andre @ gmx.de

  2. Hi!

    Ich möchte mehrere Datensätze anhand der ID aus einem Table einer mySQL-Datenbank löschen.

    Ich hab das für einen Datensatz so gemacht, aber wie geht das, wenn ich jetzt von ID X bis ID Y löschen möchte?

    DELETE FROM visits WHERE id = '44' LIMIT 1;

    DELETE FROM visits WHERE id >= '20' AND id <= '$30';

    löscht alle Datensätze mit den IDs 20-30

    Viele Grüße
    Andreas

    PS:
    http://www.little-idiot.de/mysql/mysql-117.html
    http://de.mysql.com/documentation/mysql/bychapter/manual.de_Reference.html#DELETE
    http://de.mysql.com/documentation/mysql/bychapter/manual.de_Reference.html#SELECT

    1. DELETE FROM visits WHERE id >= '20' AND id <= '$30';

      ^
      das muß so heißen:

      DELETE FROM visits WHERE id >= '20' AND id <= '30';

      Grüße
      Andreas

      1. DELETE FROM visits WHERE id >= '20' AND id <= '$30';
                                                                ^
        das muß so heißen:

        DELETE FROM visits WHERE id >= '20' AND id <= '30';

        Hallo Andreas,

        sollte man die IDs nicht ohne Häkchen schreiben? Oder geht das auch so? Nicht dass MySQL die nacher alphanumerisch sortiert. Das wäre bei anderen Zahlen verheerend.

        Grüße

        Tom

        1. Halihallo Tom

          DELETE FROM visits WHERE id >= '20' AND id <= '$30';
                                                                  ^
          das muß so heißen:

          DELETE FROM visits WHERE id >= '20' AND id <= '30';

          sollte man die IDs nicht ohne Häkchen schreiben? Oder geht das auch so? Nicht dass MySQL die nacher alphanumerisch sortiert. Das wäre bei anderen Zahlen verheerend.

          Muss man nicht, da der Datentyp (und somit auch die Auswirkungen auf die Sortierung) durch die Datenbank vorgegeben ist und nicht durch die Syntax im Query. Es läuft genau anders herum: Was auch immer im Query steht, wird, nach Möglichkeit, in den Datentyp der Datenbank "übersetzt". Ist die ID ein nummerischer Wert, wird also nicht alphanummerisch sortiert, egal ob da gequotet ist oder nicht.

          Viele Grüsse

          Philipp

          1. Hallo,

            Was auch immer im Query steht, wird, nach Möglichkeit, in den Datentyp der Datenbank "übersetzt". Ist die ID ein nummerischer Wert, wird also nicht alphanummerisch sortiert, egal ob da gequotet ist oder nicht.

            Dieses Verhalten muß aber, wenn überhaupt, nicht für alle Datenbanksysteme gelten. Es kann z.B. durchaus auch sein, daß dadurch verhindert wird, daß auf Indizes zurückgegriffen werden kann, womit solche Statements full-table-scans auslösen (bei Oracle ist dies afaik so).

            Außerdem ist imho der intensive Gebrauch von Quotes in  SQL-Statements unsinnig. Wozu es gut sien, Tabellen- und Feldnamen unter Qoutes zu stellen? Das ist, wiederum afaik, nur in einigen wenigen Datenbanksystemen überhaupt erlaubt. Wird dann auf eine andere Datenbank gewechselt, aus welchen Gründen auch immer, so sind sämtliche Statements anzupassen (ok, ich weiß daß das meist sowieso notwendig ist).

            Ein einfaches
            DELETE FROM visits WHERE id >= 20 AND id <= 30;

            funktioniert dagegen bei jeder mir bekannten SQL-fähigen Datenbank.

            Grüße
              Klaus

            1. Halihallo Klaus

              Was auch immer im Query steht, wird, nach Möglichkeit, in den Datentyp der Datenbank "übersetzt". Ist die ID ein nummerischer Wert, wird also nicht alphanummerisch sortiert, egal ob da gequotet ist oder nicht.

              Dieses Verhalten muß aber, wenn überhaupt, nicht für alle Datenbanksysteme gelten. Es kann z.B. durchaus auch sein, daß dadurch verhindert wird, daß auf Indizes zurückgegriffen werden kann, womit solche Statements full-table-scans auslösen (bei Oracle ist dies afaik so).

              Meines Erachtens wäre dies jedoch ein Fehler im Algorithmus. Oder was spricht dafür, dass das Quoting die Indizies verhindert? - Der Datentyp wird ja von der Datenbank vorgegeben, ist also "verbindlich". Dadurch muss notgedrungen der Wert, ob in Quotes oder nicht, umgewandelt werden. Warum dadurch der "Anspruch" auf den Index verfällt scheint mir unlogisch. Aber vielleicht hab ich was nicht beachtet!?

              Außerdem ist imho der intensive Gebrauch von Quotes in  SQL-Statements unsinnig. Wozu es gut sien, Tabellen- und Feldnamen unter Qoutes zu stellen? Das ist, wiederum afaik, nur in einigen wenigen Datenbanksystemen überhaupt erlaubt. Wird dann auf eine andere Datenbank gewechselt, aus welchen Gründen auch immer, so sind sämtliche Statements anzupassen (ok, ich weiß daß das meist sowieso notwendig ist).

              Stimmt. Wie der Datentyp werden auch die Namen durch die Datenbank festgelegt; letztere dürfen auch keine SpecialChars enthalten (was ein Argument für Quotes sein könnte). Die Feld- und Tabellennamen sind analog zu Variablen in Programmiersprachen und in welcher Sprache hat man es noch gesehen, dass Variablen gequotet werden??? - IMO ist dies nur bei den Werten sinnvoll; nicht jedoch bei Namen. Also: ein ACK für dich :-)

              Viele Grüsse

              Philipp

  3. Es gibt da noch eine Variante:
    Nur bestimmte IDs löschen.
    Wenn  MySQL SubSelects könnte, wäre es noch viel einfach, hier müssen wir uns etwas behelfen.
    Zunächst selektieren wir alle IDs die wir löschen wollen, das kann auch aus einer völlig anderen Tabelle sein:
    SELECT id FROM benutzer WHERE name LIKE 'Rou%'

    Nun machen wir uns in PHP eine kleine Schleife, die durch diesen Result-Handle geht und die IDs in folgende Struktur bringt (ein String)
    xxx, yyy, zzz

    Dann können wir eine Abfrage starten:
    DELETE FROM tabelle WHERE id IN ( $meinidstring )

    1. Halihallo

      Es gibt da noch eine Variante:
      Nur bestimmte IDs löschen.
      Wenn  MySQL SubSelects könnte, wäre es noch viel einfach, hier müssen wir uns etwas behelfen.
      Zunächst selektieren wir alle IDs die wir löschen wollen, das kann auch aus einer völlig anderen Tabelle sein:
      SELECT id FROM benutzer WHERE name LIKE 'Rou%'

      Nun machen wir uns in PHP eine kleine Schleife, die durch diesen Result-Handle geht und die IDs in folgende Struktur bringt (ein String)
      xxx, yyy, zzz

      Dann können wir eine Abfrage starten:
      DELETE FROM tabelle WHERE id IN ( $meinidstring )

      ... was jedoch nur bei komplexen Selektierungen sinnvoll ist. Bei einfachen Range-Selects (also ID x - ID y) wäre dies, ich versuche es mal studentisch auszudrücken, ein ziemlich unperformant integrierter Algorithmus :-)
      zwei Queries für eine Zielsetzung...

      Viele Grüsse

      Philipp
         <-- der grad von der Vorlesung "Meth. d. prak. Informatik" kommt :-)