MySQL - Einfügefehler ignorieren: doppelter Eintrag

75

Ich arbeite in PHP.

Bitte geben Sie an, wie Sie neue Datensätze in die Datenbank einfügen können, die über ein eindeutiges Feld verfügt. Ich füge viele Datensätze in einen Stapel ein und möchte nur, dass die neuen eingefügt werden, und ich möchte keinen Fehler für den doppelten Eintrag.

Gibt es nur eine Möglichkeit, zuerst ein SELECT zu erstellen und festzustellen, ob der Eintrag bereits vor dem INSERT vorhanden ist - und nur dann, wenn SELECT keine Datensätze zurückgibt? Ich hoffe nicht.

Ich möchte MySQL irgendwie anweisen, diese Einfügungen ohne Fehler zu ignorieren.

Vielen Dank

Neon-
quelle
Einfügen ignorieren funktioniert für mich Das Problem ist, dass einige Zeilen aus der Tabelle gelöscht werden und ich versuche, die Zeilen mit der gleichen ID einzufügen, die zuvor in diesem Fall gelöscht wurden. Die Anweisung "Einfügen ignorieren" funktionierte
Balaji

Antworten:

164

Sie können die Syntax INSERT ... IGNORE verwenden, wenn Sie bei einem doppelten Datensatz keine Aktion ausführen möchten.

Sie können die REPLACE INTO- Syntax verwenden, wenn Sie einen alten Datensatz mit demselben Schlüssel durch einen neuen überschreiben möchten.

Sie können auch die Syntax INSERT ... ON DUPLICATE KEY UPDATE verwenden, wenn Sie stattdessen eine Aktualisierung des Datensatzes durchführen möchten, wenn Sie auf ein Duplikat stoßen.

Bearbeiten: Ich dachte, ich würde einige Beispiele hinzufügen.

Beispiele

Angenommen, Sie haben eine Tabelle tblmit zwei Spalten idund value. Es gibt einen Eintrag, id = 1 und value = 1. Wenn Sie die folgenden Anweisungen ausführen:

REPLACE INTO tbl VALUES(1,50);

Sie haben noch einen Datensatz mit id = 1 value = 50. Beachten Sie, dass der gesamte Datensatz jedoch zuerst GELÖSCHT und dann erneut eingefügt wurde. Dann:

INSERT IGNORE INTO tbl VALUES (1,10);

Die Operation wird erfolgreich ausgeführt, es wird jedoch nichts eingefügt. Sie haben immer noch id = 1 und value = 50. Schließlich:

INSERT INTO tbl VALUES (1,200) ON DUPLICATE KEY UPDATE value=200;

Sie haben jetzt einen einzelnen Datensatz mit id = 1 und value = 200.

Zombat
quelle
9
"Wenn Sie das Schlüsselwort IGNORE verwenden, werden Fehler, die beim Ausführen der INSERT-Anweisung auftreten, stattdessen als Warnungen behandelt." -aus dem obigen Link einfügen
gradbot
2
Warnungen lösen jedoch keinen Fehler aus, sodass Ihr Skript weiterhin ausgeführt wird. Aus dem Handbuch: Wenn Sie das Schlüsselwort IGNORE verwenden, werden Fehler, die beim Ausführen der INSERT-Anweisung auftreten, stattdessen als Warnungen behandelt. Ohne IGNORE verursacht beispielsweise eine Zeile, die einen vorhandenen UNIQUE-Index oder PRIMARY KEY-Wert in der Tabelle dupliziert, einen Fehler beim Duplizieren des Schlüssels und die Anweisung wird abgebrochen. Bei IGNORE wird die Zeile immer noch nicht eingefügt, es wird jedoch kein Fehler ausgegeben.
Zombat
IGNOREignoriert Fehler, die möglicherweise nichts mit doppelten Schlüsseln zu tun haben. Es ist besser, wenn ON DUPLICATE KEY UPDATE field=fieldSie diese Fehler abfangen und als Bonus keine Warnungen erhalten.
Chinoto Vokro
-1

Sie können sicherstellen, dass Sie keine doppelten Informationen einfügen, indem Sie die EXISTS-Bedingung verwenden.

Wenn Sie beispielsweise eine Tabelle mit dem Namen clients mit dem Primärschlüssel client_id hatten, können Sie die folgende Anweisung verwenden:

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 einer Unterauswahl ein.

Wenn Sie einen einzelnen Datensatz einfügen möchten, können Sie die folgende Anweisung verwenden:

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);

Durch die Verwendung der dualen Tabelle können Sie Ihre Werte in eine select-Anweisung eingeben, obwohl die Werte derzeit nicht in einer Tabelle gespeichert sind.

von http://www.techonthenet.com/sql/insert.php

gehsekky
quelle
Dies ist nicht der richtige Weg, dies zu tun. Diese Lösung ist langsam, schwieriger zu warten und fehleranfällig. Die Verwendung von INSERT mit IGNORE wäre eine viel bessere Lösung.
Womp
Dies scheint ein kartesischer Join zu sein, der unter diesen Umständen nicht empfohlen wird.
Blaues Wasser
-3

Versuchen Sie, eine doppelte Tabelle, vorzugsweise eine temporäre Tabelle, ohne die eindeutige Einschränkung zu erstellen, und laden Sie diese in diese Tabelle. Wählen Sie dann nur die eindeutigen (DISTINCT) Elemente aus der temporären Tabelle aus und fügen Sie sie in die Zieltabelle ein.

Jordan S. Jones
quelle
-3
$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";
}
chandrasekar
quelle