1Danke
ERLEDIGT
JA
JA
ANTWORTEN
14
14
ZUGRIFFE
10457
10457
EMPFEHLEN
-
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.
-
das hatte ich schon befürchtetIF NOT EXISTS ist für die Erzeugung von Datenbanken/Tabellen gedacht, mir wäre neu, dass es beim INSERT etwas zu Suchen hat.

ein UNIQUE über 2 Spalten? so etwas geht?Lege einen UNIQUE-Key über die Spalten email und datum an.
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.
-
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 :1 2 3 4
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.Dülken Abi 2007 - Abitain You
"Sometimes you have a programming problem and it seems like the best solution is to use regular expressions; now you have two problems." David Mertz
-
Werde mir das mal anschauen und feedback geben.Dort..."index über 2 Spalten anlegen" ....OK...den Rest siehst du dann schon.
Oder einfach nur dieses Query absetzen:
Code :1 2 3 4
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.
Richtig!Wenn ich dich richtig verstehe, kannst du kein Unique verwenden, da deine Daten nur für ein Tag unique seien dürfen?!
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.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.
-
In mySQL könntest du das so lösen
Code sql:1 2 3 4 5
IF NOT EXISTS (SELECT xyz FROM TABLE WHERE col = 'xyz') THEN INSERT INTO.... ELSE UPDATE.... END IF;
Dülken Abi 2007 - Abitain You
"Sometimes you have a programming problem and it seems like the best solution is to use regular expressions; now you have two problems." David Mertz
-
@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
Code sql:1 2 3 4 5 6 7 8 9 10 11
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?
-
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?

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
-
Du kannst auch mit einem INSERT.....SELECT das ganze überlisten.
Code sql:1 2 3 4 5 6 7 8 9
INSERT INTO daten (email, datum, feld1) SELECT d.* FROM (SELECT 'myEmail' AS email, 'myDate' AS datum, 'myField1' AS field1) AS d WHERE 0 IN (SELECT COUNT(*) FROM daten WHERE email = 'myEmail' AND datum NOT LIKE 'HEUTE%')
Wir machen also eine Unterabfrage die uns eine Tabelle mit einer Zeile und allen Werten ausgibt.
Im Haubtselect nehmen wir diese Unterabfrage (d) und kontrollieren im WHERE-Teil ob bereits Daten in der Zeiltabelle vorhanden sind.---------------------------------------------------------------------------------------------------
item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
item: Tutorial: [PHP][MySQL] Debug Queries
item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben
-
-
Code sql:
1 2 3 4 5 6 7 8 9
INSERT INTO kp_test (`email`, `date`, `nachricht`) SELECT d.* FROM (SELECT 'test@test.de' AS `emai`, '2010-03-07' AS `date`, 'test4' AS `nachricht`) AS d WHERE '' IN (SELECT COUNT(*) FROM kp_test WHERE `email` = 'test@test.de' AND `date` LIKE '2010-03-07%')
So sieht es aus die Lösung und ob sie in der Praxis das macht was sie soll werde ich bei der nächsten großen Aktion sehen wo viele Kunden rein kommen.
Erstmal ein großes danke an alle helfenden.
Setze dann das Thema auf gelöst und hoffe es nicht nochmal wecken zu müssen
-
26.01.12 12:35 #14
- Registriert seit
- Nov 2007
- Beiträge
- 255
Hallo ihr,
Ich möchte da mal ein sehr altes Thema nocheinmal aufgreifen!
Leider verstehe ich den contex des vorherigen Problemes nicht genau und wollte um unterstützung bitten!
ich will 6 einträge in meine Datenbank machen davon soll einer auf existenz überprüft werden,... sollte dieser schon vorhanden sein, soll nichts gemacht werden wenn nicht soll alles eingetragen werden!
sid soll auf existenz geprüft werden!PHP-Code:INSERT INTO
".$db." (
sid,
buch,
kapitel,
position,
verse,
text
) VALUES (
'".$sid."',
'".$buch."',
'".$kapitel."',
'".$position."',
'".$verse."',
'".$text."'
)";
Danke
-
ist sid der PrimaryKey der Tabelle?
---------------------------------------------------------------------------------------------------
item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
item: Tutorial: [PHP][MySQL] Debug Queries
item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben
Ähnliche Themen
-
[MySQL] DROP TABLE IF EXISTS temp_table - gibt einen Fehler...
Von Herr_M im Forum Relationale DatenbanksystemeAntworten: 2Letzter Beitrag: 20.02.09, 08:53 -
Trigger IF Insert exists nichts eintragen
Von draig im Forum Relationale DatenbanksystemeAntworten: 2Letzter Beitrag: 25.01.07, 21:17 -
[MySql] Exists in Where-Klause - komplexe Abfrage
Von Subwoover im Forum Relationale DatenbanksystemeAntworten: 9Letzter Beitrag: 16.10.06, 14:31 -
Php Und Mysql(insert)
Von adil im Forum PHPAntworten: 5Letzter Beitrag: 28.07.06, 21:57 -
NOT EXISTS - Anweisung in MySQL
Von joeyjmr im Forum Relationale DatenbanksystemeAntworten: 5Letzter Beitrag: 06.02.06, 14:52





Zitieren


Login






[PHP][Snippet] Array zu XML konvertieren