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 ...
随机推荐
- jQuery 取值、赋值的基本方法整理
/*获得TEXT.AREATEXT的值*/ var textval = $("#text_id").attr("value"); //或者 var textva ...
- 洛谷 3959 宝藏——枚举+状压dp
题目:https://www.luogu.org/problemnew/show/P3959 原来写了个不枚举起点的状压dp. #include<iostream> #include< ...
- 完美解决IE8不支持margin auto问题
不用js,超级简单,完美支持. body下的整个container .container { overflow: hidden; margin: 0px auto; text-align: cente ...
- 前端(jQuery)(5)-- jQuery AJAX异步访问和加载片段
异步访问 index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset ...
- 傳説中的 jsonp
jsonp的由來 1 . 網頁上的東西衹要跨域了就不能傳送或者接受數據了.不管是什麽衹要是跨域.Ajax直接请求普通文件存在跨域无权限访问的问题, 2 . 但是src這個東西比較厲害了,請求哪裏都可以 ...
- Hackerrank--Divisibility of Power(Math)
题目链接 You are given an array A of size N. You are asked to answer Q queries. Each query is of the for ...
- JS---案例:滚动条
案例:滚动条 html框架分为4部分,最外面的div, 放文字的div, 装滚动条的div层,以及滚动条本身放在一个div里面 <!DOCTYPE html> <html> & ...
- day18 13.乐观锁介绍
乐观锁是使用版本字段,悲观锁是使用数据库底层的锁机制.mysql的类型timestamp(时间戳)有一个特点:插入数据不用管我,我取系统当前默认值.timestamp插入时间会记录,修改时间也会记录. ...
- linux性能监视工具sar
sar是一个优秀的一般性能监视工具,它可以输出Linux所完成的几乎所有工作的数据.sar命令在sysetat rpm中提供.示例中使用sysstat版本5.0.5,这是稳定的最新版本之一.关于版本和 ...
- win10 系统同步时间出错
设置->时间和语言->区域和语言->其他日期,区域和时间设置->设置时间和日期->Internet时间->更改设置 应该会有两个服务器,分别更新下时间,哪个正确就用 ...