当前位置 博文首页 > zx1323的博客:Navicat mysql 建表字段 默认值、empty string、

    zx1323的博客:Navicat mysql 建表字段 默认值、empty string、

    作者:[db:作者] 时间:2021-09-01 19:18

    总结如下图

    ?

    ?

    ========================分割线=======================

    简单测试了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