mysql insert ignore into... Rückgabewert doppelte?
Thilo
- datenbank
Hallo,
doppelte Einträge bei einem Uniquefeld würden die insertprozedur stoppen. Mit "ignore" geht's das zwar aber schön wäre es noch ein Rückgabeprotokoll zu haben, das mit zumindest anzeigt wie viele Datensätze nicht eingetragen wurden aufgrund Doppler. Noch besser eine auflistung der betroffenen Datensätze.
Gibt es also einen internen Fehlercode den ich mittels PHP bekommen kann zum jeweiligen betroffenen Datensatz, oder eine andere Lösung?
Gruss
Thilo
ps. Oft weiss ich hier nicht welche Kategorie ich nehmen soll, in diesem Fall PHP oder Datenbank. Da diese Kombi oft zutrifft wäre vielleicht eine Extra Kategorie "PHP/DATENBANK" gar nicht so verkehrt;-)
Tach!
Gibt es also einen internen Fehlercode den ich mittels PHP bekommen kann zum jeweiligen betroffenen Datensatz, oder eine andere Lösung?
Du musst erst einmal im MySQL-Handbuch nachlesen, was dieses für Möglichkeiten beim INSERT IGNORE anbietet. Nur das kann ja dann PHP übernehmen. Ich vermute es wird affected Rows geben und vielleicht noch Warnings, aber ansonsten wird es beim Ignore nicht viel anderes geben.
dedlfix.
Hallo,
Du musst erst einmal im MySQL-Handbuch nachlesen, was dieses für Möglichkeiten beim INSERT IGNORE anbietet. Nur das kann ja dann PHP übernehmen. Ich vermute es wird affected Rows geben und vielleicht noch Warnings, aber ansonsten wird es beim Ignore nicht viel anderes geben.
na ja das Handbuch antwortet da etwas irritierend drauf:
"Wenn Sie das Schlüsselwort IGNORE angeben, werden Fehler, die während der Ausführung der INSERT-Anweisung auftreten, als Warnungen behandelt. So würde beispielsweise ohne IGNORE ein Datensatz, der einen vorhandenen eindeutigen Index oder einen Primärschlüsselwert in der Tabelle dupliziert, einen Dublettenfehler verursachen, woraufhin die Anweisung abgebrochen würde. Bei IGNORE wird der Datensatz zwar auch nicht eingefügt, aber es wird kein Fehler ausgegeben. Bei Fehler auslösenden Datenkonvertierungen wird die Anweisung abgebrochen, wenn IGNORE nicht angegeben ist. Bei IGNORE hingegen werden ungültige Werte auf den jeweils nächstgelegenen gültigen Wert gesetzt und dann einfügt; außerdem werden Warnungen erzeugt, aber die Anweisung wird nicht abgebrochen. Mit der C-API-Funktion mysql_info() können Sie ermitteln, wie viele Datensätze tatsächlich in die Tabelle eingefügt wurden."
Erster Satz = Warnungen
Dritter Satz = Doch keine Warnung?
Wie ist das überhaupt mit Rückgabewerten(Warnungen/Hinweise)? Ich sehe die ja niemals nach einem Insert, wenn alles OK ist. Ist da trotzdem eine Möglichkeit diese zu sehen?
Gruss
Thilo
Tach!
Erster Satz = Warnungen
Dritter Satz = Doch keine Warnung?
"Wenn Sie das Schlüsselwort IGNORE angeben, werden Fehler, die während der Ausführung der INSERT-Anweisung auftreten, als Warnungen behandelt.
Das heißt also, dass du Warnungen ausgeben lassen kannst. Das kann man mit der mysql-Extension meines Wissens nach nur über ein SQL-Statement, die mysqli-Extension hat hingegen was entsprechendes eingebaut.
So würde beispielsweise ohne IGNORE ein Datensatz, der einen vorhandenen eindeutigen Index oder einen Primärschlüsselwert in der Tabelle dupliziert, einen Dublettenfehler verursachen, woraufhin die Anweisung abgebrochen würde. Bei IGNORE wird der Datensatz zwar auch nicht eingefügt, aber es wird kein Fehler ausgegeben.
Da wäre jetzt der dritte Satz mit dabei, aber da steht nichts gegenteiliges.
Und dann wäre da noch das englische Original, bei dem noch ein Satz mehr drinsteht (wieder eine Bestätigung dafür, Übersetzungen links liegen zu lassen): "Ignored errors may generate warnings instead, although duplicate-key errors do not." Das dürfte dann der ausschlaggebende Hinweis sein, dein Vorhaben nicht mit IGNORE umsetzen zu können.
Bei Fehler auslösenden Datenkonvertierungen [...]
Trifft nicht für deinen Dubletten-Fall zu.
Wie ist das überhaupt mit Rückgabewerten(Warnungen/Hinweise)? Ich sehe die ja niemals nach einem Insert, wenn alles OK ist. Ist da trotzdem eine Möglichkeit diese zu sehen?
Ja, siehe oben, Warnungen explizit abfragen.
dedlfix.
Ich würds selber prüfen und nur die Dinge eintragen die noch nicht vorhanden sind. Zum Beispiel erst in eine temporäre Tabelle eintragen und dann nur die Einträge übernehmen die es noch nicht gibt. Dann hast du selbst in der Hand was du tust.
Tach!
Ich würds selber prüfen und nur die Dinge eintragen die noch nicht vorhanden sind. Zum Beispiel erst in eine temporäre Tabelle eintragen und dann nur die Einträge übernehmen die es noch nicht gibt. Dann hast du selbst in der Hand was du tust.
Das ist ungünstig, weil man sich so ein eventuelles TOCTTOU-Problem einfängt. Dann lieber einzelne INSERTs ohne IGNORE und mit Prüfung auf den Duplicate Error. Das Ergebnis ist dasselbe, aber sicherer.
dedlfix.
Hallo,
doppelte Einträge bei einem Uniquefeld würden die insertprozedur stoppen. Mit "ignore" geht's das zwar aber schön wäre es noch ein Rückgabeprotokoll zu haben, das mit zumindest anzeigt wie viele Datensätze nicht eingetragen wurden aufgrund Doppler. Noch besser eine auflistung der betroffenen Datensätze.
Mit Insert... On Duplicate Key...
hättest Du mehr Möglichkeiten.
Horst Ignor