mysql建表语句非空约束默认_Navicat mysql 建表字段 默认值 空白、NULL 、empty string的区别...

总结在最后,没啥干货

新建一张用户表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;

一. 不做非空约束

1)将所有字段全部设置为空白

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`;

保存结果:成功,表结构没有改变

2)NULL值是默认的,也不需要测试了

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'】

此时的表结构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;

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.

保存结果:成功,表结构如下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;

小结:

二. 勾选“不是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`;

保存结果:成功,表结构如下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)修改为:NULLALTER 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`;

保存结果:成功,表结构无变化

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;

这里遇到一个情况

如果是bigit设置成''再选择成空白,sql语句是,导致保存失败MODIFY COLUMN `id` bigint(20) NOT NULL DEFAULT '' COMMENT '编号' FIRST ;

选择NULL才可以恢复,可能是我使用的版本问题

勾选“不是null”时,

总结:

区别在于是否进行了非空约束

3. 从现实的使用场景中要考虑的地方

NULL导致索引失效,在使用当中尽可能避免NULL值的出现

a.没有非空约束的字段,加上默认值

b.有非空约束的字段就需要注意:默认值在程序代码中的判断方式

可能之前的判断方式是if(id == null){ alert("该用户不存在") }else{ 发送ajax请求到后台查询 }现在就必须是这样了if(id == 0){ alert("该用户不存在") }else{ 发送ajax请求到后台查询 }

虽然不改看起来没什么错误,但一次无效的操作应当从源头上避免

所以在一开始设计数据库时应当考虑到这个情况,不然数据库字段好改,检查程序代码就要费很大的精力

写的不够严谨的地方,希望大家多多指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值