MySQL中栏位定义的NULL, NOT NULL, NOT NULL DEFAULT

原创
2021/07/12 18:28
阅读数 195

执行结果演示以MySQL 8为准

  • NULL: 可以输入null, 也可以输入该栏位定义格式的值
  • NOT NULL: 不可以输入null, 只能输入该栏位格式定义的值
  • NOT NULL DEFAULT 'defualt_value': 不可以输入null, 默认值是defualt_value(DDL语句必须加单引号).

我们来测试一下NOT NULL定义的栏位的执行结果:

  1. 先看 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

  1. 有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不占空间

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部