mysql给字段设置默认值,以及mysql的严格模式
一、背景
在插入数据库时,报错#1364,后来才知道是字段在创建的时候,没有设置默认值的原因。关于默认值,我们都知道设置默认值为0或者null的时候,就算我们不插入该字段,数据库也会自动按照默认值填充,那么为什么一定要设置默认值呢?
二、解释
这部分参考链接:https://segmentfault.com/q/1010000000411353
错误的原因是没启用MySQL的严格模式(strict mode),很多快捷开发环境自带的MySQL(PHPnow WAMP Appserv等),都没有启用严格模式,甚至是在一些产品环境(production environment)都忽略了这点。
非严格模式下,MySQL会容忍许多开发上的疏忽,例如把一个长度100的字符串插入到varcaht中只会截断多余的部分而不报错。严格模式对数据的格式、长度、类型等进行校验,你贴出的建表语句中指定了DEFAULT,如果此时不指定DEFAULT,在你认为会启用默认值的时候会返回#1364错误。
开发阶段最好启用严格模式,这是对我们代码严谨性的测试,严进宽出也能保证转移到产品环境和后续的数据库迁移、重构顺利。
为什么数据库要设置默认值呢?因为我们希望在插入数据时,有意或无意间被忽略的字段能够交由MySQL按你事先预想的方式处理,例如一些默认正常状态码、用户插入数据时候尚未设置的文本字段,诸如此类。
我的习惯是任何数据表的任何列都是非空(NOT NULL),在此基础上将数字默认设为0,文本默认设为’’(在PHPMyAdmin中留空)。这里涉及一个NULL和’‘的区别,对此我所知尚少,我使用’‘的原因是根据语义NULL表示“此字段值为空”,而’'表示“此字段暂未设置值”。另一个原因是在MyISAM引擎下,NULL对索引、索引统计、磁盘占用都会有额外的开销,一个允许为NULL的列,每个字段的长度都比NOT NULL的多1bit,我不确定最近几年是否有所改善,涉及到NULL的资料大概是在MySQL5.0时看过的。
三、严格模式
这段文字说的特别好,里面提到了mysql的严格模式。那么什么是严格模式呢?
1、定义
简单来说就是MySQL自身对数据进行严格的校验(格式、长度、类型等),比如一个整型字段我们写入一个字符串类型的数据,在非严格模式下MySQL不会报错,同样如果定义了char或varchar类型的字段,当写入或更新的数据超过了定义的长度也不会报错。
2、如何开启
找到mysql安装目录下的my.cnf(windows系统则是my.ini)文件
在sql_mode中加入STRICT_TRANS_TABLES则表示开启严格模式,如没有加入则表示非严格模式,修改后重启mysql即可
例如这就表示开启了严格模式:
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
3、常用场景
不支持对not null字段插入null值
不支持对自增长字段插入”值
不支持text字段有默认值
注:在mysql 5.7中,是默认开启严格模式的。我们自己做本地的项目的时候,可以不开启,但是如果是做线上的项目,建议还是开启严格模式会比较好。
四、设置数据库字段的默认值
emmmmm,回归到我本来的问题,设置数据库的默认值:
1、单个字段
//alter table 数据表 modify `字段名` 字段类型 DEFAULT 默认值;
alter table 数据表 modify `字段名` VARCHAR (255) DEFAULT null;
2、同一个表的多个字段
//同一个表可以同时设置多个字段的默认值,用逗号(,)隔开即可
alter table 数据表名 modify `name` VARCHAR (255) DEFAULT null,modify `type` INT (11) DEFAULT 0,modify `company_id` INT (11) DEFAULT 0,
modify `region_id` INT (11) DEFAULT 0,modify `farm_id` INT (11) DEFAULT 0;
end
mysql给字段设置默认值,以及mysql的严格模式相关推荐
- c mysql 的默认值_为mysql表字段设置默认值的方法及注意细节
为mysql表字段设置默认值的方法及注意细节,有需要的朋友可以参考下. 环境:MySQL 5.1 + 命令行工具 问题:MySQL表字段设置默认值 解决方法: 代码如下: --SQL: CREATE ...
- jpa mysql timestamp_Java JPA设置默认值、Timestamp设置、自动获取时间
设置默认值 @Column(name="state",columnDefinition="tinyint default 0") private Integer ...
- MySQL修改字段的默认值和空值
MySQL修改字段的默认值和空值 一.修改字段默认值 修改: ALTER TABLE 表名 ALTER COLUMN 字段名 SET DEFAULT 默认值 删除: ALTER TABLE 表名 AL ...
- PowerDesigner中如何给字符串字段设置默认值 .
参考:http://www.cnblogs.com/navy235/archive/2011/10/18/2216443.html 在PowerDesigner12.5中,给varchar或nvarc ...
- mysql修改字段的默认值
若本身存在默认值,则先删除 alter table表名alter column字段名drop default; 然后设置默认值(若本身不存在则可以直接设定) alter table表名 alter c ...
- 通过sql给数据库字段设置默认值
# 添加新字段 并设置默认值 alter table `user_tb` add column `user_name` varchar(20) not null DEFAULT '默认值';# 修改原 ...
- 数据库字段设置默认值
1.UPDATE 表名 set 字段名= '默认值' WHERE 字段名is null 如:UPDATE item set status= '0' WHERE status is null
- mysql为datetime类型的字段设置默认值current_timestamp,引发 Invalid default value for 错误...
[起因] 在本地数据库执行测试平台数据库结构文件data_struct.sql,执行建表语句类似如下: CREATE TABLE `demo` (`id` int(10) unsigned NOT N ...
- mysql增加字段设默认值_mysql原表增加字段且设置默认值及修改字段默认值
-- 增加字段及注释 alter table sr_zjff_main add zjbzjxbj int(1) DEFAULT '0' COMMENT ''; alter table sr_main_ ...
最新文章
- 使用Android BindingAdapter与InverseBindingAdapter实现SeekBar双向(正向/反向)数据绑定...
- 编程一万小时是种什么样的体验?
- 及上一篇linux安装mysql的说明
- python 文件 IO 操作
- Ubuntu下一个好用的终端
- Sleuth则是用来共方便的集成Zipkin。
- 【项目管理】外包和采购
- linux驱动编写(usb host驱动入门)
- Snabbt.js – 极简的 JavaScript 动画库
- 环洋市场调研-2021年全球Camlock联轴器行业调研及趋势分析报告
- Elasticsearch 聚合搜索技术深入
- 数字IC后端需要学习什么?需要具备哪些技能?
- Openwrt编译进阶-修改ROOT密码,修改默认WiFi名称,修改主机名,修改主机型号
- 网络安全课程设计Java实现DES加密算法(可视化界面)代码+设计文档
- 计算机教师结构化方式面试,市计算机:17名学生通过全国教师资格证结构化面试...
- Python代码使用easyocr识别身份证号码
- 货场RFID智能称重管理系统
- 蛋白组学ITRAQ、TMT技术
- 易游网吧无盘服务器安装,易游无盘安装教程
- 维盟服务器系统,10.198.1.1维盟服务器系统登录?
热门文章
- Tensor for ‘out‘ is on CPU, Tensor for argument #1 ‘self‘ is on CPU
- RandLA-Net测试
- Windows 无法启动 NVIDIA Display Container LS 服务
- attribute 'downsample' of type 'NoneType' is not usable in a script method
- libtorch demo
- H5Stream播放RTSP流视频
- qcolor文字生成颜色
- 使用python中的socket实现服务器和客户端,并完成图片的传输
- C++学习笔记-----用位运算实现加减乘除
- C++ 创建单级、多级目录