MySQL INSERT INTO IF NOT EXISTS?

Hammurabi

Mitglied
bin mir nicht ganz sicher ob ich hier richtig bin da ich keinen MySQL Bereich gefunden habe.

also ich möchte gerne in eine MySQL Anweisung ausführen in einem PHP Script mit IF NOT EXISTS, weil:

Bisher habe ich immer eine abfrage gestartet die nachschaut ob an diesem Tag und mit dieser E-Mail schon etwas INSERTE'T wurde das funktionierte auch sehr gut habe dann im PHP das ausgewertet und entweder ausgegeben das Eintrag doppelt ist oder halt den INSERT gestartet.

Jetzt mein Problem:
- Seit geraumer zeit kommen trotz dieser abfrage immer wieder Einträge doppelt rein mit einer Differenz zwischen 0s und 2min kann mir das nicht erklären

Lösungsansatz:
- will das in die MySQL Anweisung einbauen damit direkt vor dem INSERT abgefragt wird(sollte ja sicher sein)

also in Text sähe das dann so aus:

INSERT INTO "daten" IF NOT EXISTS email = email AND datum NOT LIKE 'HEUTE%'

wie sieht dann die MySQL Syntax aus bzw. habt ihr eine Lösung dafür?
 
Moin,

IF NOT EXISTS ist für die Erzeugung von Datenbanken/Tabellen gedacht, mir wäre neu, dass es beim INSERT etwas zu Suchen hat.

Einfache Lösung(vorausgesetzt, datum enthält nur das Datum, nicht die Uhrzeit):

Lege einen UNIQUE-Key über die Spalten email und datum an.

Eine Prüfung vor oder im INSERT ist dann nicht mehr vonnöten, doppelte Daten können nicht eingetragen werden.
 
IF NOT EXISTS ist für die Erzeugung von Datenbanken/Tabellen gedacht, mir wäre neu, dass es beim INSERT etwas zu Suchen hat.
das hatte ich schon befürchtet :(

Lege einen UNIQUE-Key über die Spalten email und datum an.
ein UNIQUE über 2 Spalten? so etwas geht?

email darf nicht UNIQUE sein sonst könnte die email ja nur einmal vorkommen es soll ja aber nur auf einmal täglich begrenzt werden.
 
ein UNIQUE über 2 Spalten? so etwas geht?
Jo, sowas geht :)

Gehe in PHPMyAdmin zum Struktur-Tab der Tabelle.
Ganz unten findest du einen Link "Details".

Dort..."index über 2 Spalten anlegen" ....OK...den Rest siehst du dann schon.

Oder einfach nur dieses Query absetzen:
Code:
ALTER TABLE `daten` ADD UNIQUE (
`email` ,
`datum`
)

Es wäre dann möglich, an jedem Tag genau 1 Datensatz mit identischer email zu speichern....mehr nicht.

email ist nicht UNIQUE, datum ist nicht UNIQUE ....nur beide zusammen sind es.
 
Wenn ich dich richtig verstehe, kannst du kein Unique verwenden, da deine Daten nur für ein Tag unique seien dürfen?!
Dann hast du aus meiner Sicht zwei Möglichkeiten, entweder das ganze mit zwei Abfragen zu lösen oder per IF(true,then,else) in mysql selber zu lösen.
Je nach größe der Datenbank rate ich dir zur ersteren Möglichkeit.
 
Dort..."index über 2 Spalten anlegen" ....OK...den Rest siehst du dann schon.

Oder einfach nur dieses Query absetzen:
Code:
ALTER TABLE `daten` ADD UNIQUE (
`email` ,
`datum`
)

Es wäre dann möglich, an jedem Tag genau 1 Datensatz mit identischer email zu speichern....mehr nicht.

email ist nicht UNIQUE, datum ist nicht UNIQUE ....nur beide zusammen sind es.

Werde mir das mal anschauen und feedback geben.

Wenn ich dich richtig verstehe, kannst du kein Unique verwenden, da deine Daten nur für ein Tag unique seien dürfen?!
Richtig!

Dann hast du aus meiner Sicht zwei Möglichkeiten, entweder das ganze mit zwei Abfragen zu lösen oder per IF(true,then,else) in mysql selber zu lösen.
ja habe ja schon etwas in PHP programmiert aber dennoch kommt es vor das doppelte rein laufen evtl. verzögerte INSERTs und in MySQL lösen wüste ich nicht wie.
 
In mySQL könntest du das so lösen
SQL:
IF NOT EXISTS (SELECT xyz FROM table WHERE col = 'xyz') THEN
                INSERT INTO....
ELSE
                UPDATE....
END IF;
 
@Sven Mintel
Okay das mit dem UNIQUE über 2 spalten funktioniert wunderbar nur leider habe ich lediglich einen timestamp somit ist das für mich keine Option eine neue spalte anzulegen oder die bestehende auf das Datum zu beschenken.

@GarGod
habe das mal so umgesetzt bekomme aber immer nur eine Fehlermeldung:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF NOT EXISTS(SELECT * FROM `kp_test` WHERE `email`='test@test.de' AND `date`!='' at line 1

SQL:
IF NOT EXISTS (
SELECT *
FROM `kp_test`
WHERE `email` = 'test@test.de'
AND `date` != '2010-03-07'
)
THEN INSERT INTO `kp_test` ( `id` , `email` , `nachricht` , `date` )
VALUES (
NULL , 'test@test.de', 'test3', '2010-03-07'
)
END IF ;

Wie muss das dann richtig aussehen?
 
Zuletzt bearbeitet von einem Moderator:
@Sven Mintel
Okay das mit dem UNIQUE über 2 spalten funktioniert wunderbar nur leider habe ich lediglich einen timestamp somit ist das für mich keine Option eine neue spalte anzulegen oder die bestehende auf das Datum zu beschenken.

Es ist keine Option, eine neue Spalte anzulegen, die es dir ermöglicht, deine Programmierung völlig fern zu halten von dem hier besprochenen Problem, aber es ist eine Option, bei jedem INSERT die DB mit einem Subselect und IF/ELSE Abfragen zu belästigen? :eek:

Deine DB wird es dir nicht danken :)
 
Es ist keine Option, eine neue Spalte anzulegen, die es dir ermöglicht, deine Programmierung völlig fern zu halten von dem hier besprochenen Problem, aber es ist eine Option, bei jedem INSERT die DB mit einem Subselect und IF/ELSE Abfragen zu belästigen? :eek:

Deine DB wird es dir nicht danken :)

das ist schon Richtig .... aber die DB umzustellen wird nichts da hängt zu viel drann und sind zu viele Datensätze die u.a. noch 0 sind

ja ein subselect ist die einzige Möglichkeit und die Auslastung werde ich dann in den 16 Kernen der Server CPU sehen ... versuche halt nur die doppelten Einträge zu vermeiden wenn es nicht funktioniert oder den Server zu sehr stresst muss es so bleiben wie es ist

aber wie sieht dann die IF/ELSE aus für mein Beispiel werde da nicht schlau daraus habe das bisher immer in PHP gemacht aber das hat ja nicht geholfen
 

Neue Beiträge

Zurück