mysql8中timestamp时间戳设置默认值 CURRENT_TIMESTAMP ,Error:1048 - Column ‘createTime‘ cannot be null

2023-05-16

解决:
方法1、换用datetime属性
方法2、执行以下sql语句,重启mysql服务

SHOW GLOBAL VARIABLES LIKE "explicit_defaults_for_timestamp";
SET persist explicit_defaults_for_timestamp=OFF;

--mysql8.0 新增了持久化修改全局变量,
--使用 set persist 和修改配置文件的效果一致,重启之后无需再改一遍了

报错场景

-- 1.用户表t_user
CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT, -- 用户编号
  `username` varchar(32) DEFAULT NULL,	-- 用户名字
  `password` varchar(32) DEFAULT NULL,	-- 用户密码
  `email` varchar(32) DEFAULT NULL,		-- 用户邮箱
  `createTime` timestamp not NULL DEFAULT CURRENT_TIMESTAMP, -- 该用户创建时间
  `updateTime` timestamp not NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- 该用户修改时间
  PRIMARY KEY (`id`) -- 设置主键
) ENGINE=InnoDB DEFAULT CHARSET=utf8

insert into t_user values
(null,'admin','1234','admin@163.com',null,null);

执行插入语句时报错:
1048 - Column ‘createTime’ cannot be null

原因

explicit_defaults_for_timestamp 系统变量决定MySQL服务端对timestamp列中的默认值和NULL值的不同处理方法。
此变量自MySQL 5.6.6 版本引入,分为全局级别和会话级别,可动态更新,默认值为OFF。
在8.0之中默认值改为了on**

explicit_defaults_for_timestamp=OFF,表示使用默认的timestamp默认格式;timestamp类型的默认格式是什么样的呢?

1.和其它字段类型不一样,这个字段默认为not null.而且不允许设置default null.
2.第一列timestamp字段,如果不强制指定默认值或on update属性的话,就会默认设为DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP。
3.非第一列timestamp字段,如果不强制指定默认值,DEFAULT ‘0000-00-00 00:00:00’
4.往该列中插入null值,会自动转化为默认值;

explicit_defaults_for_timestamp=ON,则关闭timestamp default的特性:

1.如果没有被显示指定not null,则默认为null;
2.默认值也会是null而非CURRENT_TIMESTAMP;
3.如果指定了not null属性,inset式不指定该字段的值,strict sql_mode下,会报错。非strict sql_mode下插入’0000-00-00 00:00:00’;

需要仔细考虑下面的场景:

1、timestamp not null default CURRENT_TIMESTAMP,当explicit_defaults_for_timestamp由0转为1时会带来什么业务影响?
这样的转化,如果该timestamp字段有默认值,会造成原本insert 该timestamp字段value为null的语句会插入失败,影响业务;
2、datetime default null 转成 timestamp default CURRENT_TIMESTAMP,又会带来什么业务影响呢?
做这样的字段转化,会把原本该字段为null的值都转化为CURRENT_TIMESTAMP,如果历史数据多的化,这样的转化是非常耗资源的。同时还需考虑值的转变对业务带来的影响。

Ref:https://www.cnblogs.com/janehoo/p/10116855.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql8中timestamp时间戳设置默认值 CURRENT_TIMESTAMP ,Error:1048 - Column ‘createTime‘ cannot be null 的相关文章

  • BouncyCastle 时间戳协议 |如何从 TimeStampToken 获取原始哈希值?

    我创建了一个时间戳请求从散列数据中提取数据并将其发送到 tsa TSA 回复了 已授予 响应 我已获得带有时间戳的字节数组 如何获取原始哈希数据 以便验证 TSA 发送的时间戳是否是我所要求的时间戳 提前致谢 Request TimeSta
  • 用于 mongodb ObjectId 创建时间

    The ObjectId用作 mongodb 文档中的默认键具有嵌入的时间戳 调用 objectid Generation time 返回一个日期时间对象 那么是否可以使用这个生成时间而不是保留单独的创建时间戳 您如何能够使用此嵌入时间戳按
  • 在 python 中监控文件是否停止写入

    我有一个程序每秒不断写入文件 文件写入是在与 UI 并行的线程中进行的 由于某些硬件问题 它有时会停止写入 我想检查文件是否停止写入 如果没有更新则重新启动程序 我想检查文件的时间戳 看看它是否没有更新 并且不想访问看门狗等 因为我只需要文
  • 为什么 date() 不能正确地将 YYMMDDHHMM 转换为 MySQL 可接受的日期格式?

    我想要一个像这样的字符串 1511030830 YYMMDDHHMM 并创建一个 MySQL 时间戳 如下所示 2015 11 03 08 30 00 但是 当尝试这样做时 它将不起作用 string 1511030830 date dat
  • pandas to_dict 具有 python 本机日期时间类型而不是时间戳

    我有一个pandas DataFrame df其中包含Timesatamp列 我希望创建一个行迭代器 通过iter 方法或通过to dict from df哪里的Timesatamp值是 pythondatetime 我试过这样做 for
  • PHP mysql 自动插入时间戳

    假设我有一个包含这些字段的表名称 auto parts id part price timestamp我通过 php 插入一个新行 如下所示 query insert into auto parts id part price timest
  • 带时间戳零的 PHP 日期返回 1 小时

    如果我执行以下操作 date H i s 0 它返回01 00 00 同时它should give 00 00 00 它可能与我的本地主机的时区有关吗 世界标准时间 1 如果是这样 我该如何解决这个问题 致电前设置时区date 你将使用da
  • PHP:获取年份的最后一位数字(示例:2015 == 5)

    如何转换我的函数以显示 Y 标签中的最后一个和 或倒数第二个数字 这是我的代码 如何将其转换为显示时间 4 10 20 19 59 34 or 0004 10 20 19 59 34 代替 1974 10 20 1
  • 将日期字符串转换为时间戳以按亚秒精度排序

    我有一个专栏date在 pySpark 数据框中 日期格式如下 2018 02 01T13 13 12 023507 我想将该列中的日期从字符串转换为时间戳 或者我可以根据日期对其进行排序的内容 到目前为止 我已经尝试过以下方法 new d
  • 在 Hive HQL 中将字符串转换为时间戳

    我有一个像 08 03 2018 02 00 00 这样的字符串 我试图将其转换为时间戳值 我正在使用下面的代码 unix timestamp 08 03 2018 02 00 00 yyyy MM dd T HH mm ss SSSXXX
  • ElasticSearch 在 Groovy 脚本中获得时间

    我的应用程序使用此脚本来提升索引中最新的项目 5 3 16 pow 10 11 abs time doc date date getMillis 0 2 1 0 它是用 MVEL 编写的 但从 1 3 开始 Groovy 已弃用 MVEL
  • 如何进行 git rebase 并保留提交时间戳?

    我想进行变基以从我的历史记录中删除某个提交 我知道该怎么做 但是 如果我这样做 提交时间戳将设置为我完成变基的那一刻 我希望提交保留时间戳 我在这里看到了最后一个答案 https stackoverflow com a 19522951 3
  • 在 Postgres 中添加 current_timestamp 和 days 列的总和

    我想通过向当前时间添加天数来更新列 用伪语法来说 它是 UPDATE foo SET time current timestamp days integer days 是同一个表中的一列 select now cast 1 day as i
  • 如何在 Hive 中将字符串转换为毫秒时间戳

    我有一个字符串 20141014123456789 它代表一个毫秒时间戳 我需要将其转换为 Hive 中的时间戳 0 13 0 而不丢失毫秒 我尝试了这个 但 unix timestamp 返回一个整数 所以我丢失了毫秒 from unix
  • 在php中获取今天和昨天的时间戳

    如何使用php中的strtotime 函数获取今天 昨天和前天12点的时间戳 12 点钟是一个变量 可以由用户更改 hour 12 today strtotime hour 00 00 yesterday strtotime 1 day t
  • 使用 pandas 计算不规则时间序列的每日平均值

    我正在尝试从 csv 文件的不规则时间序列中获取每日平均值 csv 文件中的数据从 2013 年 9 月 20 日 13 00 开始 一直持续到 2014 年 1 月 14 日 10 57 Time Values 20 09 2013 13
  • 时间戳转字符串日期

    我不知道如何将时间戳转换为日期 我有 public void onCreate Bundle savedInstanceState super onCreate savedInstanceState setContentView R lay
  • 当时间戳不属于索引时,如何按时间戳对数据帧进行切片?

    如何使用时间戳来分割我的 pandas 数据帧 我打电话时得到以下价格df30m Timestamp Open High Low Close Volume 0 2016 05 01 19 30 00 449 80 450 13 449 80
  • 我应该如何存储不同时区事件的数据?

    这是一个概念性问题 因此这里没有代码片段 假设我创建了一个事件数据库 其中一些在纽约 一些在芝加哥 一些在凤凰城 等等 我的服务器的时区设置为纽约 在我看来 为所有这些事件创建 UNIX 时间戳时有两种选择 考虑时区 即 1 月 1 日午夜
  • 格式化时间戳

    如何将 Rails 时间戳格式化为更易于理解的格式 如果我只是打印出来created at or updated at在我看来是这样的 然后我会得到 2009 03 27 23 53 38 世界标准时间 The strftime http

随机推荐