Skip to content

Pitfalls of missing transactions when handling multiple inserts in Mysql

Imagine, you have a table and a colum is defined NOT NULL. You (and i) expect, that NULL arguments will not go into the table but instead get rejected.


----- cut -----

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.0.41-log Source distribution

mysql> CREATE TABLE notnulltest (id INT, test TEXT NOT NULL);
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO notnulltest (id, test) VALUES (1, NULL);
ERROR 1048 (23000): Column 'test' cannot be null
mysql> INSERT INTO notnulltest (id, test) VALUES (1, NULL), (2, NULL);
Query OK, 2 rows affected, 2 warnings (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 2

mysql> SELECT id, test FROM notnulltest;
+------+------+
| id | test |
+------+------+
| 1 | |
| 2 | |
+------+------+
2 rows in set (0.00 sec)

mysql> SELECT id, test FROM notnulltest WHERE test IS NULL;
Empty set (0.00 sec)
----- cut -----


So whats going on here?


Since Mysql had no transactions (in the past), it tries to avoid any error in multi-column inserts. Without transactions, the insert cannot be rolled back, so an error would leave an unknown number of inserted rows around and the application had to deal with the problem. For Mysql it seems a far better solution to modify your data so it fit's the requirements.


Worth mentioning, this is the default behaviour in a recent (5.0.41) mysql version, installed from source, with no config modifications.

Trauringe

Bei all unseren Hochzeitsvorbereitungen hätten wir glatt die Ringe vergessen. Da hilft auch keine Checkliste: was da nicht draufsteht, das kann man schon mal übersehen.

Also waren wir heute mal nach Ringen schauen und wurden auch fündig. Weißgold, etwas breiter gefasst, dafür flacher. Auf der Oberseite ist ein dreieckiges Muster aufgebracht.


Alles in allem: hübsch anzuschauen.


Parken müsste man können

Heute im Parkhaus eines größeren Einkaufscenters: vor uns fährt ein Kleintransporter, langsam, schleichend, eine Parklücke suchend. Bereits beim Einfahren in das Parkhaus war zu sehen, das eine Reihe weiter jede Menge Parkplätze frei sind und der Fahrstuhl befindet sich zwischen den beiden Reihen. Der Transporter hat eine schmale Lücke erspäht, zwischen einem parkenden Auto und einem Pfeiler. Also wird jetzt 3 mal angesetzt, bis das Fahrzeug halbwegs gerade rückwärts in die Lücke fahren kann, ganz langsam natürlich, es ist nicht viel Platz links und rechts. Endlich können wir auch vorbei, ich fahre eine Reihe weiter und habe keinerlei Rangierprobleme: es gibt schliesslich genügend freie Parkplätze.


Während wir zum Fahrstuhl gehen, sehe ich, wie der Fahrer des Transporters weder links noch rechts aussteigen kann: zu wenig Platz. Seine vorher ausgestiegene Frau gibt ihm dann den Hinweis, doch mal eine Reihe weiter zu fahren, dort sind genügend Parkplätze frei ...