mysql设置text字段为not null,并且没有默认值,插入报错:doesn't have a default value
一、问题描述
在往数据库写入数据的时候,报错:
'字段名' doesn't have a default value
本来这个错误是经常见到的,无非就是字段没有设置默认值造成的。奇怪的是,我这边报错的字段,其类型是text类型。众所周知的,text类型是不能有默认值的。如此一来就有了矛盾,text类型的字段明明不能有默认值,那么为什么还会给我报错,提示缺少默认值呢?
二、问题所在
1、查看字段类型
通过phpmyadmin查看数据表的字段结构,发现text字段在创建的时候,语法为:
//创建字段abstract为text类型,默认为not null
ALTER TABLE `表名` ADD COLUMN `abstract` text not null after `content`;
这个创建语句乍一看没有问题,但是如果text类型既没有默认值,也不能为null的话,那么插入的时候,肯定是会出现问题的。
2、解决方案
按照上面的推测逻辑,重新修改字段属性:
//这里修改abstart字段的类型为text类型,去掉了not null
ALTER TABLE `表名` modify COLUMN `abstract` text;
然后进行测试,发现写入数据成功。此时查看phpmyadmin的数据表结构,发现此时字段的默认值为null了。果然是not null的问题,问题是,创建数据表的时候,尽量设置字段为not null已经成为共识。。虽然解决了问题,但博主还是不太理解原理是什么。
关于mysql默认值和设置not null的问题,参考博客:
关于mysql设置varchar 字段的默认值”和null的区别,以及varchar和char的区别
三、为什么会报错
1、第一个原因
通过一顿百度,终于在百度知道上看到这句话:
如果是not null的话,那你就必须插入一个值,你不插入值的话,就会调用默认值。 如果这两个都没有的话,就会报错了。
这个意思就和咱们最开始推测的差不多,字段类型既是 not null,而且还没默认值,那么在写入数据的时候肯定是有问题的。就像我们平时看到的,在创建字段并且不设置默认值的时候,mysql都会默认给字段加上默认值null。
2、第二个原因
这个原因就是数据库的严格模式的问题。在mysql 5.7之后,数据库默认都是采用严格模式。
关于严格模式的解释:
mysql给字段设置默认值,以及mysql的严格模式
关于严格模式这个,我并没有测试,个人感觉还是建表时候不够严谨造成的问题。关于设置字段默认值和设置not null方面不熟悉造成的。
四、总结
1、如果字段为int 或者varchar类型,那么要设置字段类型为 not null 并且设置default
2、如果字段为text,则既不需要设置not null,也不需要手动设置default 的值
3、关于text字段不能有默认值的问题,这个只针对于手动增加的default属性,如果创建字段不设置default的话,mysql会默认加上一个默认值Null
end
原文地址:https://blog.csdn.net/LJFPHP/article/details/81939189
mysql设置text字段为not null,并且没有默认值,插入报错:doesn't have a default value的更多相关文章
- MySQL语句增加字段,修改字段名,修改类型,修改默认值
原文地址:https://blog.csdn.net/kimgoo/article/details/54630257 增加字段:alter table 表名 ADD 字段 类型 约束 [默认值 注释] ...
- Sql Server 增加字段、修改字段、修改类型、修改默认值(转)
转:http://www.cnblogs.com/pangpanghuan/p/6432331.html Sql Server 增加字段.修改字段.修改类型.修改默认值 1.修改字段名: alter ...
- Sql Server 增加字段、修改字段、修改类型、修改默认值
1.修改字段名: alter table 表名 rename column A to B 2.修改字段类型: alter table 表名 alter column 字段名 type not null ...
- java里null强转为某个类会报错吗?
1.定义一个User类如下: /** * @author lizhibiao * @date 2018/11/27 17:21 */public class User{ private String ...
- MySQL多Text字段报8126错误(解决过程)
一.背景 我们的MySQL数据库有一张10个Text的字段的表,还包括几个char和varchar字段,由于业务需求,我在表中加多一个Text字段的时候,插入记录的出现了下面的错误: Row size ...
- MySQL之text字段
TEXT类型一般分为 TINYTEXT(255长度).TEXT(65535). MEDIUMTEXT(int最大值16M),和LONGTEXT(long最大值4G)这四种,它被用来存储非二进制字符集, ...
- mysql设置updatetime字段每次修改时自动更新
我们在数据库表设计阶段中都会加上CreateTime, UpdateTime字段, 在重要业务字段更新的时候,都会重新赋值UpdateTime字段,这个对后期查找分析业务数据变更时非常有用. 但是现在 ...
- MySQL中对字段内容为Null的处理
使用如下指令,意思就是 select IFNULL(jxjy,0) AS jxjy from yourTable ifnull(a,b) 意思是指:如果字段a为null,就等于b if( sex = ...
- mysql设置主键自增长和自增长初始值
本文主要向大家介绍MySQL数据库之Mysql创建表实现主键自增并且初始值为200,希望对大家学习MySQL数据库有所帮助. 假设已经创建表test,并且主键为id.Mysql ...
随机推荐
- Java爬虫的实现
距离上一次写爬虫还是几年前了,那时候一直使用的是httpclient. 由于最近的项目又需要使用到爬虫,因此又重新查询了一些爬虫相关的框架,其中最合适的是WebMagic 官方文档:https://g ...
- 《数据结构与算法分析——C语言描述》ADT实现(NO.00) : 链表(Linked-List)
开始学习数据结构,使用的教材是机械工业出版社的<数据结构与算法分析——C语言描述>,计划将书中的ADT用C语言实现一遍,记录于此.下面是第一个最简单的结构——链表. 链表(Linked-L ...
- struts2-result-servletAPI-获得参数-参数封装
1 结果跳转方式 转发 重定向 转发到Action 重定向到Action 2 访问servletAPI方式 2.1 原理 2.2 获得API 通过ActionContext ★★★★ 通过Servl ...
- spring整合http
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接出处:https://blog.csdn.net/qq_3076499,否则保留追究法律责任的权利. 如果 ...
- Linux命令CURL用法
Curl是一个命令行方式下传输数据的开源传输工具,支持多种协议包括:FTP,HTTP,HTTPS,IMAP,POP3,TELNET等.同样支持HTTP POST方法,PUT方法,FTP上传,cooki ...
- Echarts 的简单使用
http://echarts.baidu.com/index.html 直接用script引入从官网下载的echarts.js文件 官网的文件有几种版本的,按需下载即可,注意精简版的只显示折线.圆柱等 ...
- js的剪贴板事件
定义 剪贴板操作包括剪切(cut).复制(copy)和粘贴(paste)这三个操作,快捷键分别是ctrl+x.ctrl+c.ctrl+v.当然也可以使用鼠标右键菜单进行操作 关于这3个操作共对应下列6 ...
- c#多线程通信之委托(事件)
在研究c# 线程之间通信时,发现传统的方法大概有三种 ①全局变量,由于同一进程下的多个进程之间共享数据空间,所以使用全局变量是最简单的方法,但要记住使用volatile进行限制. ②线程之间发送消息( ...
- java并发系列(七)-----ConcurrentHashMap原理分析(JDK1.8)
JDK1.8的实现已经摒弃了Segment的概念,而是直接用Node数组+链表+红黑树的数据结构来实现,并发控制使用Synchronized和CAS来操作,整个看起来就像是优化过且线程安全的HashM ...
- 直接删除mysql的日志导致mysql无法启动
--02T08::.750000Z [Warning] [MY-] [Server] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION ...