2008-11-13 28 views
17

Ist es möglich, eine Zeile einzufügen, aber nur wenn einer der bereits in der Tabelle vorhandenen Werte nicht existiert?Ist es möglich, eine Zeile einzufügen, aber nur wenn ein Wert noch nicht existiert?

Ich erstelle ein Weiterempfehlen mit Verweispunkten für ein E-Commerce-System, wo ich die E-Mail des Freundes in die Datenbanktabelle einfügen muss, aber nur, wenn es nicht bereits in der Tabelle vorhanden ist. Das ist, weil ich nicht mehr als 1 Person will, die die Empfehlungspunkte erhält, sobald der neue Kunde sich anmeldet und etwas kauft. Deshalb möchte ich nur einmal eine Email in der Tabelle haben.

Ich benutze PHP 4 und MySql 4.1.

Antwort

21

Wenn die Spalte ein Primärschlüssel oder ein eindeutiger Index ist: obwohl

INSERT INTO table (email) VALUES (email_address) ON DUPLICATE KEY UPDATE 
email=email_address 

Zu wissen, mein Glück gibt es einen besseren Weg, es zu tun. AFAIK gibt es kein Äquivalent von "ON DUPLICATE KEY DO NOTHING" in MySQL. Ich bin mir nicht sicher über das Bit email = email_Address, über das Sie spielen könnten und sehen, ob es funktioniert, ohne dass Sie eine Aktion angeben müssen. Wie jemand weiter oben sagt, wird nichts passieren, wenn es einzigartige Einschränkungen dafür gibt. Und wenn Sie möchten, dass alle E-Mail-Adressen in einer Tabelle eindeutig sind, gibt es keinen Grund, sie in Ihrer Spaltendefinition als eindeutig zu definieren.

+0

Ich habe die E-Mail auf einen eindeutigen Schlüssel in phpMyAdmin eingestellt und dann Ihren Code verwendet. Und es hat super geklappt! Danke – alex

+0

Re: kein Äquivalent von ON DUPLICATE KEY DO NOTHING. Siehe Todds Lösung. Alternativ könnten Sie wahrscheinlich etwas wie ON DUPLICATE KEY UPDATE E-Mail = E-Mail tun, obwohl es sicherlich verschwenderischer ist. –

1

Ich bin mir nicht sicher, ob ich es bekommen habe, aber was ist mit einem

try { 
    mysql_query($sql); 
} 
catch(Exception $e) { 

} 

mit einem eindeutigen Feldindex in MySQL kombiniert?

Wenn es eine Ausnahme auslöst, dann wissen Sie, dass Sie ein doppeltes Feld erhalten haben. Entschuldigung, wenn das Ihre Frage nicht beantwortet.

+0

Vielen Dank für Ihre Antwort, aber ich glaube nicht, dass mein Problem löst. Ich möchte eine einzelne Abfrage, die entweder die Zeile einfügt, oder nichts tut, wenn sie fehlschlägt. – alex

+0

Wenn eine Ausnahme ausgelöst wird, wird die Zeile nicht hinzugefügt. Sie können nur loggen oder nichts in den Fang tun. – Feet

+0

Aber mit der vorherigen Abfrage verursachte es jedes Mal einen Fehler. Ich wollte, dass es in mySql stumm scheitert. – alex

0

Wenn das email Feld der Primärschlüssel war, dann würden die Beschränkungen auf der Tabelle stoppen, ein Duplikat eingegeben zu werden.

6

Wahrscheinlich so etwas wie:

IF NOT EXISTS(SELECT * FROM myTable WHERE [email protected]) THEN INSERT INTO blah blah 

, die in eine Datenbankabfrage gerollt werden kann.

32

Dies funktioniert, wenn Sie einen eindeutigen Index oder Primärschlüssel auf der Säule (emailAddr in diesem Beispiel) haben:

INSERT IGNORE INTO Table (EmailAddr) VALUES ('[email protected]') 

diese verwenden, wenn ein Datensatz mit dieser E-Mail ist bereits vorhanden (Schlüsselverletzung duplizieren) anstelle einer Fehler, die Anweisung schlägt fehl und es wird nichts eingefügt.

Weitere Informationen finden Sie unter MySql docs.

+0

"INSERT IGNORE" ist die beste Antwort, aber REPLACE (http://dev.mysql.com/doc/refman/5.0/en/replace.html) ist auch eine Option, wenn Sie die Zeile aus irgendeinem Grund neu einfügen möchten (vielleicht ein Zeitstempel Trigger oder etwas). – gpojd

+4

Seien Sie vorsichtig bei REPLACE inkrementieren Sie Ihre Autoinkrement - unter der Haube ist es nur ein DELETE, INSERT. –

+0

das funktioniert gut für mich, muss eindeutigen Index haben – Gordon

0

MySQL bietet REPLACE INTO http://dev.mysql.com/doc/refman/5.0/en/replace.html:

REPLACE funktioniert genau wie INSERT, außer, dass, wenn eine alte Zeile in der Tabelle hat den gleichen Wert wie eine neue Zeile für einen Primärschlüssel oder einen eindeutigen Index, der alte Zeile wird gelöscht, bevor die neue Zeile eingefügt wird.

3

Eine leichte Modifikation/Ergänzung zu naeblis Antwort:

INSERT INTO table (email) VALUES (email_address) 
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id) 

Auf diese Weise müssen Sie nicht werfen email=email_address dort und Sie den richtigen Wert zu erhalten für LAST_INSERT_ID() wenn die Anweisung Updates.

Quelle: MySQL Docs: 12.2.5.3

Verwandte Themen