在 MySQL 中,每一個字段定義都包含附加約束或者修飾符,這些能夠用來增長對所輸入數據的約束。mysql
NULL 和 NOT NULL 修飾符、DEFAULT 修飾符,AUTO_INCREMENT 修飾符。sql
NULL 和 NOT NULL 修飾符ide
能夠在每一個字段後面都加上這 NULL 或 NOT NULL 修飾符來指定該字段是否能夠爲空(NULL),spa
仍是說必須填上數據 (NOT NULL)。MySQL 默認狀況下指定字段爲 NULL 修飾符,若是一個字段指定爲NOT NULL,繼承
MySQL 則不容許向該字段插入空值(這裏面說的空值都爲 NULL),由於這是 「規定」。字符串
可是在自增列和 TIMESTAMP 字段中,這個規則並不適用。it
向這些字段中插入 NULL 值將會致使插入下一個自動增長的值或者當前的時間戳。table
mysql> create table t10 ( -> id int not null default 0, -> name char(10) not null default '' -> ); Query OK, 0 rows affected (0.01 sec) #插入2個值是ok的. mysql> insert into t10 values (1,"lisi"); Query OK, 1 row affected (0.08 sec) #只插入一個值,也是ok的. mysql> insert into t10 (id) values (2); Query OK, 1 row affected (0.00 sec) #發現未插入的name列繼承default的「」值. mysql> select * from t10; +----+------+ | id | name | +----+------+ | 1 | lisi | | 2 | | +----+------+ 2 rows in set (0.00 sec) mysql> select * from t10 where name = ''; +----+------+ | id | name | +----+------+ | 2 | | +----+------+ 1 row in set (0.00 sec) #建立t11表,字段id,name不爲null. mysql> create table t11 ( id int not null, name char(10) not null); Query OK, 0 rows affected (0.01 sec) #若是隻插入其中一列,發現報錯,其中另外一列不能爲空. mysql> insert into t11 (id) values (2); ERROR 1364 (HY000): Field 'name' doesn't have a default value #若是第二列插入"null"也會報錯,設置字段爲not null. mysql> insert into t11 (id,name) values (2,null); ERROR 1048 (23000): Column 'name' cannot be null #插入「0」,""字段是ok的. mysql> insert into t11 (id,name) values (2,0); Query OK, 1 row affected (0.00 sec) mysql> insert into t11 (id,name) values (2,""); Query OK, 1 row affected (0.01 sec)
結論:class
若是一個字段中沒有指定 DEFAULT 修飾符,MySQL 會依據這個字段是 NULL 仍是 NOT NULL 自動設置默認值。select
若是指定字段能夠爲 NULL,則 MySQL 爲其設置默認值爲 NULL。
若是是 NOT NULL 字段,MySQL 對於數值類型插入 0,字符串類型插入空字符串.