Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Typischerweise werden bei MySQL die ENGINE MyISAM oder InnoDB eingesetzt. Der wesentliche Vorteil von InnoDB ist die Transaktionssicherheit. Wer häufig "Multi-Row-Inserts" benutzt, sollte diesen Service zu schätzen wissen. Was hat nun ein "Multi-Row-Insert" mit Transaktionen zu tun? Eine ganze Menge, aber probieren wir es aus.
* MySQL 5.1.30
/**
* ENGINE MyISAM
*/
CREATE TABLE test_insert_myisam (
id INT NOT NULL,
wert INT,
PRIMARY KEY (id)
) ENGINE = MyISAM;
/**
* ENGINE InnoDB
*/
CREATE TABLE test_insert_innodb (
id INT NOT NULL,
wert INT,
PRIMARY KEY (id)
) ENGINE = InnoDB;
Fügen wir also fünf Datensätze in Form eines "Multi-Row-Insert" in die MyISAM-Tabelle ein. Die Testdaten enthalten einen Fehler in der 4. Zeile. Dort ist erneut der Primary Key (PK) mit dem Wert 3 vergeben. Was passiert, wenn der Befehl ausgeführt wird?
INSERT INTO test_insert_myisam VALUES
(1, 10),
(2, 20),
(3, 30),
(3, 40),
(5, 50);
ERROR 1062 (23000): Duplicate entry '3' for key 'PRIMARY'
mysql>
Korrekterweise gibt es einen SQL-Fehler. Enthält die Tabelle nun Daten oder nicht? Schauen wir einfach nach.
SELECT * FROM test_insert_myisam;
+----+------+
| id | wert |
+----+------+
| 1 | 10 |
| 2 | 20 |
| 3 | 30 |
+----+------+
3 rows in set (0.02 sec)
Tatsächlich sind Daten vorhanden, MySQL hat alle korrekten Daten bis zur dritten Zeile eingefügt. In der vierten Zeile kommt dann der provozierte SQL-Fehler, ab da fehlen die Daten.
Fügen wir also die selben fünf Datensätze in Form eines "Multi-Row-Insert" in die InnoDB-Tabelle ein. Die Testdaten enthalten einen Fehler in der 4. Zeile. Dort ist erneut der Primary Key (PK) mit dem Wert 3 vergeben. Was passiert, wenn der Befehl ausgeführt wird?
INSERT INTO test_insert_innodb VALUES
(1, 10),
(2, 20),
(3, 30),
(3, 40),
(5, 50);
ERROR 1062 (23000): Duplicate entry '3' for key 'PRIMARY'
mysql>
Auch hier gibt es korrekterweise einen SQL-Fehler. Enthält die Tabelle nun Daten oder nicht? Probieren wir es aus.
SELECT * FROM test_insert_innodb;
Empty set (0.00 sec)
In der InnoDB Tabelle sind keine Datensätze vorhanden. Der "Multi-Row-Insert" wird als atomarer Block betrachtet und nach dem Motto "Alles oder nichts" behandelt. Es gab einen SQL-Fehler und somit wird der komplette Block abgelehnt und der ursprüngliche Tabelleninhalt wieder hergestellt.
MyISAM ist zwar die Standard-Speicher-Engine bei MySQL, aber wer auf Datenqualität angewiesen ist, ist gut beraten einen genauen Blick auf die Commit, Rollback Funktionalität der InnoDB Engine zu werfen.