执行结果演示以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不占空间