MySQL - Doppelte Datensätze abfangen
Manchmal hat man das Problem beim speichern von Einstellungen in der Datenbank, dass vorher überprüft werden muss, ob es diesen Datensatz nicht schon gibt.
Genau vor so einem Problem stand ich bei meiner Rechteverwaltung. Die Rechte werden dort mit Checkboxen gesetzt. Nun wollte ich bearbeiten und neu erstellen aber nicht getrennt Programmieren, sondern auf einem Rutsch.
Das bedeutet, man müsste erst prüfen, ob nicht schon ein Datensatz existiert. Es gibt dort zwei Möglichkeiten, ein weiteres Query zu vermeiden.
Möglichkeit 1: ON DUPLICATE KEY
Die erste, und eigentlich auch konventionelle Lösung ist die ON DUPLICATE KEY Klausel.
INSERT INTO counter
(`visitor`, `date`,`hits`)
VALUES
('127.0.0.1','2009-06-01', 1)
ON DUPLICATE KEY UPDATE
hits=hits+1;
Dabei werden die Schlüssel der Tabelle überprüft. Ist bei diesem Beispiel die IP Adresse 127.0.0.1 schon vorhanden, wird der hits-Counter um eins hochgezählt.
Möglichkeit 2: Subquery
Die zweite Möglichkeit ist mit einem doppelten Subquery zu überprüfen, ob es den Datensatz schon gibt.
INSERT INTO table
(name)
SELECT
distinct('lala')
FROM
adressliste
WHERE
NOT EXISTS (
select name from adressliste where name = 'lala'
)
Bei dem insert wird mit einem "dummy"-Select der zukünftige Inhalt des Datensatzes ('lala') "ausgelesen". Dieser Inhalt wird unter der Bedingung "Du bist nicht schon in der Tabelle enthalten", welches mit einem Sub-Subquery überprüft wird, an das insert übergeben.
Die Prüfung passiert dort mit der NOT EXISTS Klausel. Alles was also nicht bei dieser Abfrage raus kommt, wird in die Tabelle eingefügt.
Möglichkeit Nr. 2 ist allerdings nur bei Tabellen die keine Schlüssel definiert haben sinnvoll. (Jeder der eine Tabelle ohne Schlüssel erstellt gehört verprügelt.)





