Navicat mysql 建表字段 默认值、empty string、空白、NULL 的区别
总结在最后,没啥干货
简单测试了4种类型 bigint tinyint varchar char
单引号 ‘’
双引号 “”
自定义的默认值 如: 未知的姓名
===================================================
新建一张用户表
CREATE TABLE `user` (`id` bigint(20) DEFAULT NULL COMMENT '编号',`name` varchar(64) DEFAULT NULL COMMENT '姓名',`gender` char(64) DEFAULT NULL COMMENT '性别',`age` tinyint(4) DEFAULT NULL COMMENT '年龄'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
这张表 由于没设置主键 所以可以新增一条 4个字段都是null的数据 (当然这样的数据是毫无意义的)
所有的字段默认值都是 NULL
一. 不做非空约束
1)将所有字段全部设置为空白【NULL>>空白】
SQL预览
ALTER TABLE `user`
MODIFY COLUMN `id` bigint(20) NULL COMMENT '编号' FIRST ,
MODIFY COLUMN `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '姓名' AFTER `id`,
MODIFY COLUMN `gender` char(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '性别' AFTER `name`,
MODIFY COLUMN `age` tinyint(4) NULL COMMENT '年龄' AFTER `gender`;
保存结果:成功,表结构没有改变
结论:不做非空约束时,空白 和 NULL 是相同的
2)NULL值是默认的,也不需要测试了【NULL>>NULL】
3)全部修改为 Empty string【NULL>>Empty string】
ALTER TABLE `user`
MODIFY COLUMN `id` bigint(20) NULL DEFAULT '' COMMENT '编号' FIRST ,
MODIFY COLUMN `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '姓名' AFTER `id`,
MODIFY COLUMN `gender` char(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '性别' AFTER `name`,
MODIFY COLUMN `age` tinyint(4) NULL DEFAULT '' COMMENT '年龄' AFTER `gender`;
保存结果:失败,报错【1067 - Invalid default value for ‘id’】
其实从改动的sql语句中就能看出来 数字是不存在 ‘’ 这种类型的
结论:无非空约束时,bigint、tinyint类型都不能被设置为 Empty string
此时的表结构
CREATE TABLE `user` (`id` bigint(20) DEFAULT NULL COMMENT '编号',`name` varchar(64) DEFAULT '' COMMENT '姓名',`gender` char(64) DEFAULT '' COMMENT '性别',`age` tinyint(4) DEFAULT NULL COMMENT '年龄'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
那么这里就有一个疑问了【如果我手动给name、age设置值’’ “” 或者’未知名称’的区别】
a.
ALTER TABLE `user`
MODIFY COLUMN `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '姓名' AFTER `id`,
MODIFY COLUMN `gender` char(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '性别' AFTER `name`;
b.
ALTER TABLE `user`
MODIFY COLUMN `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT "" COMMENT '姓名' AFTER `id`,
MODIFY COLUMN `gender` char(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT "" COMMENT '性别' AFTER `name`;
a、b保存结果:成功,表结构没有改变
c.
ALTER TABLE `user`
MODIFY COLUMN `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '未知名称' COMMENT '姓名' AFTER `id`,
MODIFY COLUMN `gender` char(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '未知性别' COMMENT '性别' AFTER `name`;
保存结果:成功,表结构如下
CREATE TABLE `user` (`id` bigint(20) DEFAULT NULL COMMENT '编号',`name` varchar(64) DEFAULT '未知名称' COMMENT '姓名',`gender` char(64) DEFAULT '未知性别' COMMENT '性别',`age` tinyint(4) DEFAULT NULL COMMENT '年龄'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
该表结构,如果新增一条数据
INSERT INTO `user` (age) VALUES (10);
得到的数据是这样的
你可以不设置值,数据库自动设置了默认值,但是这里会有个陷阱
INSERT INTO `user` (name, age) VALUES (NULL, 11);
没有使用默认值哦,在使用类似PageHelper这样的插件时,注意 insert insertSelective两种方法
小结:不做非空约束时,empty string只针对 字符 类型的字段使用,’'和""同empty string的效果是相同的;空白 和 NULL的效果是相同的
二. 勾选“不是null”
恢复为初始状态,勾选“不是null”表结构如下
CREATE TABLE `user` (`id` bigint(20) NOT NULL COMMENT '编号',`name` varchar(64) NOT NULL COMMENT '姓名',`gender` char(64) NOT NULL COMMENT '性别',`age` tinyint(4) NOT NULL COMMENT '年龄'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
此时,所有字段默认都变成了 空白
1)默认为空白,跳过【空白>>空白】
2)修改为:NULL【空白>>NULL】
ALTER TABLE `user`
MODIFY COLUMN `id` bigint(20) NOT NULL COMMENT '编号' FIRST ,
MODIFY COLUMN `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '姓名' AFTER `id`,
MODIFY COLUMN `gender` char(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '性别' AFTER `name`,
MODIFY COLUMN `age` tinyint(4) NOT NULL COMMENT '年龄' AFTER `gender`;
保存结果:成功,表结构无变化
3)修改为:Empty string或者 ‘’ 或者 “”【空白>>Empty string】【空白>>’’】【空白>>""】,忽略bigint tinyint
ALTER TABLE `user`
MODIFY COLUMN `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '姓名' AFTER `id`,
MODIFY COLUMN `gender` char(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '性别' AFTER `name`,
保存结果:成功,表结构如下
CREATE TABLE `user` (`id` bigint(20) NOT NULL COMMENT '编号',`name` varchar(64) NOT NULL DEFAULT '' COMMENT '姓名',`gender` char(64) NOT NULL DEFAULT '' COMMENT '性别',`age` tinyint(4) NOT NULL COMMENT '年龄'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
这里遇到一个情况
如果是bigint设置成’'再选择成空白,导致保存失败,sql语句是
MODIFY COLUMN `id` bigint(20) NOT NULL DEFAULT '' COMMENT '编号' FIRST ;
选择NULL才可以恢复,可能是我使用的版本问题
小结: 勾选“不是null”时,empty string只针对 字符 类型的字段使用,’'和""同empty string的效果是相同的;空白 和 NULL的效果是相同的
总结:
1.’'和""同Empty string的效果是相同的(没有内容长度的默认值)
只能使用在字符类型 如: char、varchar、text等,不能使用在数字、时间等类型 如:int、tinyint、bigint、date、double
因为会提示报错
2.空白 和 NULL的效果是相同的,具体情况取决于【非空约束】
a. 无非空约束: 都是 DEFAULT NULL
b. 有非空约束: 都是 NOT NULL
3.如果感觉看不太明白,建议自己动手测试一下
毕竟1个字段上最直观的展现就DDL语句
博主,你的文笔太垃圾了,每一个字我都认识,连在一起看的我云里雾里的,给点干货?
1.字段勾选上 不是 null
2.设置默认值
3.特殊情况,像是“备注”这种字段,不会成为查询条件的,就随意
写的不够严谨的地方,希望大家多多指正!