Einfache SQL-Abfrage
dolflyer
- datenbank
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?
Hallo!
wenn ich jetzt von ID X bis ID Y löschen möchte?
DELETE FROM
visits
WHEREid
= '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
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
WHEREid
= '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
DELETE FROM
visits
WHEREid
>= '20' ANDid
<= '$30';
^
das muß so heißen:
DELETE FROM visits
WHERE id
>= '20' AND id
<= '30';
Grüße
Andreas
DELETE FROM
visits
WHEREid
>= '20' ANDid
<= '$30';
^
das muß so heißen:
DELETE FROM
visits
WHEREid
>= '20' ANDid
<= '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
Halihallo Tom
DELETE FROM
visits
WHEREid
>= '20' ANDid
<= '$30';
^
das muß so heißen:
DELETE FROM
visits
WHEREid
>= '20' ANDid
<= '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
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
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
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 )
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 :-)