Basierend auf meiner Recherche würde ich sagen, dass es sowohl an dir liegen könnte als auch an MySQL. Überprüfe deine Tabellendefinitionen mit SHOW CREATE TABLE table_name;
. Achte auf alle Felder, die mit NOT NULL
definiert sind.
Das MySQL 5.6 Referenzhandbuch: 13.2.5 INSERT-Syntax besagt:
Einsetzen von NULL in eine Spalte, die als NOT NULL deklariert wurde. Für mehrzeilige INSERT-Anweisungen oder INSERT INTO ... SELECT-Anweisungen wird die Spalte auf den impliziten Standardwert für den Spaltendatentyp gesetzt. Dies ist 0 für numerische Typen, der leere String ('') für Zeichentypen und der "Null"-Wert für Datum- und Zeittypen. INSERT INTO ... SELECT-Anweisungen werden genauso behandelt wie mehrzeilige Einfügungen da der Server das Ergebnisset aus dem SELECT nicht untersucht um festzustellen, ob es eine einzelne Zeile zurückgibt. (Für eine einzelne INSERT-Anweisung tritt kein Warnung auf, wenn NULL in eine NOT NULL Spalte eingefügt wird. Stattdessen schlägt die Anweisung mit einem Fehler fehl.)
Dies würde darauf hindeuten, dass es keine Rolle spielt, welchen SQL-Modus du verwendest. Wenn du eine einzige Zeile INSERT
(wie in deinem Beispielcode) durchführst und einen NULL
-Wert in eine Spalte einfügst, die mit NOT NULL
definiert ist, soll es nicht funktionieren.
Ironischerweise besagt das MySQL-Handbuch in demselben Atemzug, dass folgendes zutrifft, und der SQL-Modus spielt in diesem Fall eine Rolle:
Wenn du nicht im strikten SQL-Modus bist, wird eine Spalte ohne expliziten Wert auf ihren Standardwert (explizit oder implizit) gesetzt. Wenn du beispielsweise eine Spaltenliste angibst, die nicht alle Spalten in der Tabelle benennt, werden unbenannte Spalten auf ihre Standardwerte gesetzt. Die Zuweisung von Standardwerten wird im Abschnitt 11.6, "Standardwerte Datentypen", beschrieben. Siehe auch Abschnitt 1.7.3.3, "Einschränkungen für ungültige Daten".
Daher kannst du nicht gewinnen! ;-) Spaß beiseite. Die Sache ist, zu akzeptieren, dass NOT NULL
in einer MySQL-Tabellenspalte wirklich bedeutet Ich werde keinen NULL-Wert für ein Feld akzeptieren, wenn ich einen einzelnen INSERT
durchführe, unabhängig vom SQL-Modus.
Alles in allem ist das Folgende aus dem Handbuch auch wahr:
Für die Dateneingabe in eine NOT NULL-Spalte ohne explizite DEFAULT-Klausel, wenn eine INSERT- oder REPLACE-Anweisung keinen Wert für die Spalte enthält, oder eine UPDATE-Anweisung die Spalte auf NULL setzt, bearbeitet MySQL die Spalte entsprechend dem SQL-Modus derzeit in Kraft:
Wenn der strenger SQL-Modus aktiviert ist, tritt ein Fehler für transaktionale Tabellen auf und die Anweisung wird zurückgesetzt. Für nicht-transaktionale Tabellen tritt ein Fehler auf, aber wenn dies für die zweite oder weitere Zeile einer mehrzeiligen Anweisung geschieht, wurden die vorangehenden Zeilen bereits eingefügt.
Wenn der strikte Modus nicht aktiviert ist, setzt MySQL die Spalte auf den impliziten Standardwert für den Spaltendatentyp.
Also, sei getrost. Lege deine Standardwerte in der Geschäftslogik (Objekte) fest und lass die Datenschicht davon ausgehen. Standardwerte in der Datenbank scheinen eine gute Idee zu sein, aber würdest du sie vermissen, wenn sie nicht existierten? Wenn ein Baum im Wald fällt...