dedlfix: MySQL: INSERT, bei bestehendem Key bestehenden Wert lesen

Beitrag lesen

Hi!

Sofern ID existiert und ein Datensatz bzw eine Ergebnismenge zurückgeliefert wird, wird das Array verworfen und gegen die Werte aus der Datenbank ersetzt. Wenn die ID noch nicht existiert, wird das Array per INSERT in die Datenbank geschrieben.

Und zwischen Abfrage und Einfügen können andere Prozesse dazwischenfunken, wenn du keine Sperren verwendest. Schon deshalb ist dieses Vorgehen so nicht empfehlenswert.

Bei einem neuen Eintrag ist also eine Abfrage notwendig, bei einem bestehenden Eintrag sind zwei notwendig - der Regelfall ist, dass der Eintrag schon besteht. Darum gibt es, eine Abfrage einzusparen.
Die Frage nun: gibt es in MySQL[1] eine Möglichkeit, dies mit nur einer Abfrage zu leisten. Ich stelle mir hierzu etwas in die Richtung "INSERT ... ON DUPLICATE KEY UPDATE" vor - nur eben, dass bei doppelten Key nicht upgedatet sondern der bestehende Wert gleich gelesen wird.

Versuche den Datensatz mit einem normalen INSERT einzufügen. Im Falle einer Schlüsselverletzung gibt es einen Fehler, den du abfangen musst. In dem Fall kannst du dann ein SELECT hinterherschicken, das die vorhandenen Daten abfragt. Damit ist zwar das TOCTOU-Problem gelöst, jedoch hast du nun im Regelfall zwei Abfragen statt einer. Dieses Problem lässt sich allein mit RUDI-Statements nicht lösen, aber es gibt ja Stored Procedures.

Lo!