MySQL - Einsatz Fehler ignorieren: doppelte Eintrag
Frage
Ich arbeite in PHP.
Bitte, was ist der richtige Weg, um neue Datensätze in die DB einzufügen, das eindeutige Feld hat. Ich bin viele Datensätze in einem Batch-Einfügen und ich möchte nur die neuen eingesetzt werden, und ich will keine Fehler für den doppelten Eintrag.
Gibt es nur Weg, um zuerst eine SELECT und um zu sehen, zu machen, wenn der Eintrag bereits dort vor dem INSERT ist - und nur einfügen, wenn SELECT keine Datensätze zurückgibt? Ich hoffe nicht.
Ich möchte irgendwie MySQL sagen, diese Einsätze ohne Fehler zu ignorieren.
Danke
Lösung
Sie können mit INSERT ... IGNORE Syntax, wenn Sie wollen keine Maßnahmen ergreifen, wenn es ein doppelter Datensatz ist.
Sie können mit REPLACE INTO Syntax, wenn Sie wollen überschreiben einen alten Datensatz mit einem neuen mit dem gleichen Schlüssel.
Alternativ können Sie INSERT ... ON DUPLICATE KEY UPDATE Syntax, wenn Sie ein Update für die Aufzeichnung statt ausführen möchten, wenn Sie ein Duplikat begegnen.
Edit:. Dachte ich einige Beispiele hinzufügen würde
Beispiele
Angenommen, Sie eine Tabelle mit dem Namen tbl
mit zwei Spalten, id
und value
haben. Es gibt einen Eintrag, ID = 1 und Wert = 1. Wenn Sie die folgenden Anweisungen ausführen:
REPLACE INTO tbl VALUES(1,50);
Sie haben noch einen Datensatz, mit id = 1 Wert = 50. Beachten Sie, dass der gesamte Datensatz jedoch zuerst gelöscht und dann wieder eingesetzt. Dann gilt:
INSERT IGNORE INTO tbl VALUES (1,10);
Die Operation erfolgreich ausgeführt, aber nichts eingeführt wird. Sie haben noch id = 1 und Wert = 50. Schließlich:
INSERT INTO tbl VALUES (1,200) ON DUPLICATE KEY UPDATE value=200;
Sie haben nun einen einzelnen Datensatz mit id = 1 und Wert = 200.
Andere Tipps
Sie können mit Auslöser .
Überprüfen Sie auch diese Einführung Leitfaden für auslöst .
Wie sieht das Datenbankschema aus?
Sie können eine ID-Spalte hinzufügen, die href="http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html" rel="nofollow noreferrer"> auto für jeden Einsatz, eindeutige Zeilen zu gewährleisten.
Frage: Ich bin die Einrichtung einer Datenbank mit Clients. Ich weiß, dass Sie die „Einfügen“ Anweisung verwenden, um Informationen in der Datenbank einzufügen, aber wie kann ich sicher sein, dass ich nicht die gleichen Client-Informationen erneut eingeben?
Antwort:. Sie können sicherstellen, dass Sie doppelte Informationen nicht einfügen, indem Sie die EXISTS-Bedingung
Zum Beispiel, wenn Sie einen Tisch haben Kunden mit einem Primärschlüssel von client_id genannt, könnten Sie die folgende Anweisung:
INSERT INTO clients
(client_id, client_name, client_type)
SELECT supplier_id, supplier_name, 'advertising'
FROM suppliers
WHERE not exists (select * from clients
where clients.client_id = suppliers.supplier_id);
Diese Anweisung fügt mehrere Datensätze mit einem subselect.
Wenn Sie einen einzelnen Datensatz einfügen möchten, können Sie die folgende Anweisung:
INSERT INTO clients
(client_id, client_name, client_type)
SELECT 10345, 'IBM', 'advertising'
FROM dual
WHERE not exists (select * from clients
where clients.client_id = 10345);
Die Verwendung der Dual-Tabelle können Sie Ihre Werte in einer select-Anweisung geben, auch wenn die Werte nicht zur Zeit in einer Tabelle gespeichert.
Versuchen Sie, eine doppelte Tabelle erstellen, vorzugsweise eine temporäre Tabelle, ohne die eindeutige Einschränkung und tun Sie Ihre Bulk-Ladung in dieser Tabelle. Wählen Sie dann nur die einzigartigen (DISTINCT) Elemente aus der temporären Tabelle und legen Sie in die Zieltabelle.
$duplicate_query=mysql_query("SELECT * FROM student") or die(mysql_error());
$duplicate=mysql_num_rows($duplicate_query);
if($duplicate==0)
{
while($value=mysql_fetch_array($duplicate_query)
{
if(($value['name']==$name)&& ($value['email']==$email)&& ($value['mobile']==$mobile)&& ($value['resume']==$resume))
{
echo $query="INSERT INTO student(name,email,mobile,resume)VALUES('$name','$email','$mobile','$resume')";
$res=mysql_query($query);
if($query)
{
echo "Success";
}
else
{
echo "Error";
}
else
{
echo "Duplicate Entry";
}
}
}
}
else
{
echo "Records Already Exixts";
}