MYSQL Field „xyz“ has no default values

Nach einem Debian Upgrade funktioniert der MySQL / MariaDB nicht mehr, wie erwartet.
Man möchte Werte speichern und bekommt eine Fehlermeldung, die besagt, dass ein Feld keine Default Werte hat.

Was passiert genau?

Im Grund ist die Programmierung unsauber: Man möchte einen INSERT Befehl ausführen, bei dem nicht alle Spalten / Felder einer SQL Tabelle mit Werte beschrieben werden. Das ist im Grunde nicht schlimm, solange man in der Tabelle für diese Spalten Default-Werte einstellt, die als Ersatz für unvollständige INSERTs gelten.

Das Speichern unvollständiger INSERTs war bei früheren MySQL Versionen problemlos machbar, aber nach einer Aktualisierung sind die Defaulteinstellungen der MariaDB / MySQL Server schärfer und man hat dieses Verhalten.

Was kann man tun?

Zum einen sollte man die Tabellen durchsehen und diese korrigieren, dass im Zweifel sinnvolle Default Werte gespeichert werden.
Bei produktiven Servern hat man oft nach einem Upgrade nicht die Zeit, diese Arbeit zu machen, und muss das System schnell wieder in einen lauffähigen Zustand überführen.

Ein ganz schneller Pfusch-FIX ist es per phpmysql einen SQL Befahl abzusetzen:
set sql_mode = „ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION“;

Dann läuft der Server wieder und die Geschäftsführung ist erstmal happy, aber dieser Befehl hält nur bis zum nächsten Neustart.

Nachhaltig wäre es, wenn man den SQL-Mode wieder auf die Werte zurücksetzt, die der MySQL Server vor dem Upgrade hatte.

Hierzu loggt Ihr Euch auf der Konsole ein, startet sicherheitshalber den SQL Server noch mal neu (service mysql restart)und meldet Euch an den SQL Server an:

mysql -uuser -ppassword

Dann folgenden Befehl absetzen:

SELECT @@SQL_MODE;

Das Ergebnis wird wie folgt aussehen:

+——————————————————————————————-+
| @@SQL_MODE |
+——————————————————————————————-+
| STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+——————————————————————————————-+

Der problematische Mode ist: STRICT_TRANS_TABLES. Jetzt wissen wir die anderen Modi, die wir weiter verwenden werden.
Um den SQL Mode dauerhaft beim Start fest zu setzen, müssen wir an die my.cnf ran und diese editieren.

nano /etc/mysql/my.cnf

hier unter [mysqld] folgende Zeile gemäß unserem Beispiel oben ohne STRICT_TRANS_TABLES einfügen:

sql_mode        =NO_ENGINE_SUBSTITUTION,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER

Speichern und mySQL Server neu starten

Alles ist gut 😉

admin has written 102 articles