it-swarm.com.de

MySQL nicht Null Spalten, die Nullwerte akzeptieren

Ich habe Probleme mit MySQL nicht Null Spalten. Es scheint, dass meine MySQL-Installation Nullwerte für NOT NULL-Spalten akzeptiert.

Meine MySQL-Version ist 5.6.25-1 ~ dotdeb + 7.1 (debian).

Nehmen Sie diese Tabelle zum Beispiel:

CREATE TABLE `cities` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `state_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5562;

Wenn ich einen Wert wie diesen einfüge:

insert into cities(state_id) values (20);

MySQL verschüttet eine Warnung, schreibt den Wert aber trotzdem fest. Hier ist die Warnung.

12:51:43    insert into cities(state_id) values (20)    1 row(s) affected, 1 warning(s): 1364 Field 'name' doesn't have a default value 0.000 sec

Wenn ich den eindeutigen Schlüssel unique_city_in_state entferne, erhalte ich das gleiche Verhalten.

Ich habe auch versucht, die Namensspalte mit einem DEFAULT NULL zu erstellen, wie folgt:

  `name` varchar(255) NOT NULL DEFAULT NULL,

Dies führt zu einem Fehler, der grob übersetzt werden würde (Standardwert für Name ungültig).

Ich habe eine andere MySQL-Installation 5.1.73-1 (Debian) ausprobiert und habe das gleiche Verhalten.

(How can I have NULL values on the name column?

(enter image description here

Wenn ich das jetzt mache

insert into cities (name, state_id) values (null, 19);

Ich erhalte den FEHLER 1048 (23000), was bedeutet, dass der Spaltenname nicht leer sein darf.

Jede Hilfe ist willkommen.

7
ddutra

Es akzeptiert tatsächlich keine NULL-Werte und betrachtet es als leere Zeichenfolge. Das liegt daran, dass sich Ihr Server im nicht strengen Modus befindet. Dies steuert, wie MySQL ungültige oder fehlende Werte in Einfügungen und Aktualisierungen behandelt. Weitere Informationen zu Modi finden Sie hier: http://dev.mysql.com/doc/refman/5.6/en/sql-mode.html#sql-mode-strict

mysql> insert into cities(state_id) values (20);
Query OK, 1 row affected, 1 warning (0.07 sec)

mysql> show warnings;
+---------+------+-------------------------------------------+
| Level   | Code | Message                                   |
+---------+------+-------------------------------------------+
| Warning | 1364 | Field 'name' doesn't have a default value |
+---------+------+-------------------------------------------+

mysql> select name is null from cities where id = LAST_INSERT_ID();
+--------------+
| name is null |
+--------------+
|            0 |
+--------------+
1 row in set (0.00 sec)

mysql> SET sql_mode = 'STRICT_ALL_TABLES';
Query OK, 0 rows affected (0.00 sec)

mysql> insert into cities(state_id) values (20);
ERROR 1364 (HY000): Field 'name' doesn't have a default value
9
Károly Nagy

Zu Károly Nagy's Punkt,

Sie können verwenden

SET SQL_MODE = 'STRICT_ALL_TABLES';

Ich bin sicher, Sie wissen es vielleicht schon, aber das ist gleichbedeutend mit:

SET @@SESSION.SQL_MODE = 'STRICT_ALL_TABLES';

Welches muss für jede Sitzung eingestellt werden. Und Sie können dies überprüfen, indem Sie dies nach der obigen Anweisung ausführen.

SELECT @@SESSION.SQL_MODE; -- 'STRICT_ALL_TABLES'

SELECT @@GLOBAL.SQL_MODE; -- 'NO_ENGINE_SUBSTITUTION'

Wenn Sie Zugriff haben, stellen Sie dies bitte auf globaler Ebene ein:

SET @@GLOBAL.SQL_MODE = 'STRICT_ALL_TABLES';

Dies wird die Standardeinstellung für jede neue Sitzung danach.

Prost, Jay; -]

HINWEIS: Getestet unter MySQL Version 5.6.23-log & MySQL Workbench 6.2.5

6
JayRizzo