当前位置 博文首页 > zx1323的博客:Navicat mysql 建表字段 默认值、empty string、
总结如下图
?
?
========================分割线=======================
简单测试了4种类型? bigint tinyint varchar?char
=================下文中会出现的一些名词===================
Empty String 等同于 单引号 ''? 双引号 ""? ? 也就是空字符串, 内容长度为0
===================================================
表结构如下, 为了保持ddl语句简洁??就没设置主键??
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;
所有字段默认都是 NULL
1)将所有字段全部设置为空白【NULL>>空白】
点击"SQL预览"选项卡,可以看到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次sql:? INSERT INTO `user` () VALUES ()
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
只改动字段name gender, 表结构如下
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;
执行2次:? INSERT INTO `user` () VALUES ()
空白和NULL 是一样的 值都是 NULL
Empty String 的值 是空字符串
=================================================================================
题外话: 设置指定的默认值
手动给name、gender设置值 '未知名称' '未知性别'? ?表结构如下
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);
出现了NULL,在使用类似PageHelper这样的插件时,注意 insert? ?insertSelective两种方法的区别
=============================================================================
表结构如下
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次:? INSERT INTO `user` () VALUES ()
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;
执行2次:? INSERT INTO `user` () VALUES ()
插入的结果都是一样的, 说明 EmptyStirng 等同 空白 和 NULL?
===========================================================================
总结:看文章最上面的图
建议动手测试一下, 观察DDL语句的变化
写的不够严谨的地方,希望大家多多指正!
2018年7月15日 01:40:14 补图
2019年11月8日 02:39:27 简化+补图
mysql DDL语句上字段的非空约束和有默认值、无默认值的区别
?
cs