執行結果演示以MySQL 8爲準
NULL
: 可以輸入null
, 也可以輸入該欄位定義格式的值NOT NULL
: 不可以輸入null
, 只能輸入該欄位格式定義的值NOT NULL DEFAULT 'defualt_value'
: 不可以輸入null
, 默認值是defualt_value(DDL語句必須加單引號).
我們來測試一下NOT NULL
定義的欄位的執行結果:
- 先看 NOT NULL帶DEFUALT的:
CREATE TABLE `test`.`t2`(
id int unsigned not null auto_increment,
`gender` varchar(10) NOT NULL DEFAULT '0',
PRIMARY KEY(`ID`)
) ENGINE=InnoDB;
插入null值:
INSERT INTO `test`.`t2`(id, `gender`)VALUES(1, null);
-- 結果: Error Code: 1048. Column 'gender' cannot be null
執行結果肯定是失敗, 這個與我們預期的一樣.
sql裏面不包含這個NOT NULL的欄位呢?
INSERT INTO `test`.`t2`(`name`)VALUES('aben');
執行結果是插入成功, 但是有warning:
1 row(s) affected, 1 warning(s): 1364 Field 'gender' doesn't have a default value
- 有NOT NULL但是不帶DEFAULT的
CREATE TABLE `test`.`t3`(
id int unsigned not null,
`gender` varchar(10) NOT NULL,
PRIMARY KEY(`id`)
) ENGINE=InnoDB;
插入null
數據肯定是報錯的, 這點毋庸置疑.
INSERT INTO `test`.`t3`(id,`gender`)VALUES(1,null);
-- 結果: Error Code: 1048. Column 'gender' cannot be null
sql裏面不包含這個NOT NULL的欄位呢?
INSERT INTO `test`.`t3`(id)VALUES(2);
執行結果是插入成功, 但是有warning:
1 row(s) affected, 1 warning(s): 1364 Field 'gender' doesn't have a default value
我們可以看到這個欄位的值是一個 empty string, 這個值與欄位類型有關.
如果NOT NULL的欄位類型換成int, 那就是0了:
CREATE TABLE `test`.`t4`(
id int unsigned not null,
`age` int NOT NULL,
PRIMARY KEY(`id`)
) ENGINE=InnoDB;
INSERT INTO `test`.`t4`(id)VALUES(2);
SELECT * FROM `test`.`t4`;
1 row(s) affected, 1 warning(s): 1364 Field 'gender' doesn't have a default value
MySQL的這個特性, 與我記憶中的SQLServer是不一樣的.
MySQL中null值佔一個bit, 而empty string不佔空間