tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von Yaslaw
ERLEDIGT
JA
ANTWORTEN
14
ZUGRIFFE
10457
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Hammurabi Hammurabi ist offline Mitglied Bronze
    Registriert seit
    Aug 2007
    Beiträge
    45
    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?
     

  2. #2
    Avatar von Sven Mintel
    Sven Mintel Sven Mintel ist offline Mitglied
    Registriert seit
    Aug 2003
    Beiträge
    18.238
    Blog-Einträge
    6
    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.
     

  3. #3
    Hammurabi Hammurabi ist offline Mitglied Bronze
    Registriert seit
    Aug 2007
    Beiträge
    45
    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.
     

  4. #4
    Avatar von Sven Mintel
    Sven Mintel Sven Mintel ist offline Mitglied
    Registriert seit
    Aug 2003
    Beiträge
    18.238
    Blog-Einträge
    6
    Zitat Zitat von Hammurabi Beitrag anzeigen
    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 :
    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.
     

  5. #5
    Avatar von GarGod
    GarGod GarGod ist offline Mitglied Gold
    Registriert seit
    Nov 2003
    Ort
    Mönchengladbach
    Beiträge
    176
    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

  6. #6
    Hammurabi Hammurabi ist offline Mitglied Bronze
    Registriert seit
    Aug 2007
    Beiträge
    45
    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.
    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.
     

  7. #7
    Avatar von GarGod
    GarGod GarGod ist offline Mitglied Gold
    Registriert seit
    Nov 2003
    Ort
    Mönchengladbach
    Beiträge
    176
    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

  8. #8
    Hammurabi Hammurabi ist offline Mitglied Bronze
    Registriert seit
    Aug 2007
    Beiträge
    45
    @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?
     

  9. #9
    Avatar von Sven Mintel
    Sven Mintel Sven Mintel ist offline Mitglied
    Registriert seit
    Aug 2003
    Beiträge
    18.238
    Blog-Einträge
    6
    Zitat Zitat von Hammurabi Beitrag anzeigen
    @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?

    Deine DB wird es dir nicht danken
     

  10. #10
    Hammurabi Hammurabi ist offline Mitglied Bronze
    Registriert seit
    Aug 2007
    Beiträge
    45
    Zitat Zitat von Sven Mintel Beitrag anzeigen
    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
     

  11. #11
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    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.
    Hammurabi bedankt sich. 
    ---------------------------------------------------------------------------------------------------
    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

  12. #12
    Avatar von Sven Mintel
    Sven Mintel Sven Mintel ist offline Mitglied
    Registriert seit
    Aug 2003
    Beiträge
    18.238
    Blog-Einträge
    6
    Zitat Zitat von Hammurabi Beitrag anzeigen
    da hängt zu viel drann und sind zu viele Datensätze die u.a. noch 0 sind
    Das wäre doch ein guter Anlass für einen Frühjahrsputz
     

  13. #13
    Hammurabi Hammurabi ist offline Mitglied Bronze
    Registriert seit
    Aug 2007
    Beiträge
    45
    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
     

  14. #14
    JesusFreak777 JesusFreak777 ist offline Mitglied Brokat
    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!

    PHP-Code:
    INSERT INTO 
                
    ".$db." (
                    
    sid,
                    
    buch
                    
    kapitel
                    
    position
                    
    verse
                    
    text
                
    VALUES (
                    
    '".$sid."',
                    
    '".$buch."'
                    
    '".$kapitel."'
                    
    '".$position."'
                    
    '".$verse."'
                    
    '".$text."'
                
    )"; 
    sid soll auf existenz geprüft werden!

    Danke
     

  15. #15
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    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

  1. [MySQL] DROP TABLE IF EXISTS temp_table - gibt einen Fehler...
    Von Herr_M im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 20.02.09, 08:53
  2. Trigger IF Insert exists nichts eintragen
    Von draig im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 25.01.07, 21:17
  3. [MySql] Exists in Where-Klause - komplexe Abfrage
    Von Subwoover im Forum Relationale Datenbanksysteme
    Antworten: 9
    Letzter Beitrag: 16.10.06, 14:31
  4. Php Und Mysql(insert)
    Von adil im Forum PHP
    Antworten: 5
    Letzter Beitrag: 28.07.06, 21:57
  5. NOT EXISTS - Anweisung in MySQL
    Von joeyjmr im Forum Relationale Datenbanksysteme
    Antworten: 5
    Letzter Beitrag: 06.02.06, 14:52