SQL Doppelte Einträge löschen?

GrumpyDude

Lt. Commander
Registriert
Okt. 2007
Beiträge
1.307
Hallo,

stehe gerade auf dem Schlauch :rolleyes:
Folgende Struktur:

ID1 ID2
1 2
1 2
1 3
2 5
4 6
3 1

Wenn ich jetzt
DELETE FROM `Table1` WHERE 'ID1' =1 AND 'ID2' =2

ausführe löscht er die ersten beiden Einträge nicht. Was mache ich falsch?
(Nicht doppelte Einträge werden mit dieser Abfrage gelöscht)
 
Zuletzt bearbeitet: (Klarstellung)
Wieso sind Spalten und Tabellen in Anführungszeichen gesetzt? Welchen Datentyp haben die Spalten?
 
Datentyp: INT

Anführungszeichen, weil ich es direkt so von PHPmyAdmin übernommen habe
Die selbe Abfrage funktioniert für NICHT Doppelte Einträge!
 
Soweit ich weiß, muss für die DELETE Anweisung ein eindeutiger Eintrag ausgewählt werden. Da du nun zwei mal den gleichen Eintrag hast, weiß die Datenbank nicht, welchen es löschen soll und macht nichts. Für nicht doppelte Einträge funktioniert das natürlich, weil diese eben eineindeutig sind.
 
Ok klingt plausibel. Hmm...
 
Probiers halt mal mit einem SELECT und schau was er dir liefert.
 
SymA schrieb:
Probiers halt mal mit einem SELECT und schau was er dir liefert.


SELECT * FROM `Table1` WHERE ID=1 and ID=2

liefert er mir:

1 2
1 2

(wie erwartet)

Schade dass es keine praktikable Lösung gibt.

Anwendungsfall ist folgendes:

Ein Skript wird immer aufgerufen mit bestimmten Insert INTO Befehlen.
Manchmal werden halt Werte doppelt hinzugefügt (kann man das direkt beim Insert Into verhindern?? dann brauche ich ja kein löschen..) und die möchte ich aus der Tabelle entfernen...
 
wie wärs wenn du alle doppelten in eine temp-tabelle schreibst und danach diese als source nimmst und alle darin enthaltenen aus deiner produktionstabelle löscht und danach die werte aus der temp-tabelle wieder zurückschreibst? (distinct eliminiert beim select doppelte datensätze)
 
@SymA: Das mit der Eindeutigkeit ist quatsch. Wie willst du denn so den Inhalt einer Tablle löschen?
@tx8090: Einfach die einfachen Anführungszeichen bei ID1 und ID2 entfernen, so wie bei deinem SELECT, dann geht es.
 
Ok Danke,

das hat funktioniert. Was ist eigentlich der Unterschied?
Warum funktioniert die Abfrage mit den Hochkommas bei Einträgen die nicht doppelt sind?
 
Irgendwo gibt's eine Dokumentation aller Hochkommata und wo sie eingesetzt werden sollten. AFAIK hat das nur Einfluss darauf, wie Namen der Tabellen und Spalten sowie Werte (Zahlen, Strings) erkannt werden, hat also nichts mit der Abfrage an sich zu tun.

Nachtrag: Eigentlich ist es klar, dass es nicht funktioniert: Ein Wert in Anführungszeichen wird als String erkannt, und der Vergleich "ID1" = 1 ergibt nunmal false.
Deine andere Abfrage hast du garantiert ohne Anführungszeichen gemacht oder hast `solche` verwendet.
 
Zuletzt bearbeitet:
tx8090 schrieb:
Ein Skript wird immer aufgerufen mit bestimmten Insert INTO Befehlen.
Manchmal werden halt Werte doppelt hinzugefügt (kann man das direkt beim Insert Into verhindern?? dann brauche ich ja kein löschen..) und die möchte ich aus der Tabelle entfernen...
Klar kann man das verhindern. Und zwar indem man die beiden Spalten zum Primary-Key macht oder als Unique definiert:
http://www.w3schools.com/sql/sql_unique.asp
 
tx8090 schrieb:
Warum funktioniert die Abfrage mit den Hochkommas bei Einträgen die nicht doppelt sind?
Das eine sind Backticks, womit du Entities (Spalten, Datenbanken, Trigger, User, etc.) ansprechen kannst, Hochkommas sind Strings.

@ WhiteShark: Der Vollständigkeit halber: INSERT IGNORE bzw. INSERT INTO ... ON DUPLICATE KEY UPDATE ... Zweite Variante ist natürlich vorzuziehen. REPLACE INTO gäbe es auch, ist aber mit einem DELETE + INSERT verbunden.
 
Zuletzt bearbeitet:
Zurück
Oben