create table test(
id int not null auto_increment,
createtime timestamp null default current_timestamp,
updatetime timestamp null default current_timestamp on update current_timestamp
同步软件报错的日志如下,提示为字段updatetime设置了无效的默认值,
ERROR_GENERAL "Handling new table 'test'.'flow' failed
execute create table statement failed, statement CREATE TABLE `test`.`test` ( `id` INT NOT NULL, `createtime` TIMESTAMP, `updatetime` TIMESTAMP ) COLLATE utf8_general_ci
[MySQL][ODBC 5.3(w) Driver][mysqld-5.7.20-log]Invalid default value for 'updatetime'
细致的同学,可能会注意到,日志中记录的SQL语句显示createtime和updatetime都只声明了TIMESTAMP类型,缺少了原始建表语句中的NULL和DEFAULT属性,这会有什么影响?
《故障分析 | MySQL 迁移后 timestamp 列 cannot be null》这篇文章其实介绍过,MySQL中有个explicit_defaults_for_timestamp变量,他决定了MySQL是否为TIMESTAMP列的默认值和NULL值的处理启用某些非标准的行为,
https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html
如文档所说,如果explicit_defaults_for_timestamp=OFF ,服务器会启用非标准行为,并按以下规则处理TIMESTAMP列:
(1) 没有明确使用NULL属性声明的TIMESTAMP列会自动使用NOT NULL属性声明。给这样的列分配一个NULL的值是允许的,并将该列设置为current timestamp。
(2) 表中的第一个TIMESTAMP列,如果没有明确地用NULL属性,DEFAULT属性或ON UPDATE属性声明,将自动用DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP属性声明。
(3) 在第一个列之后的TIMESTAMP列,如果没有明确地用NULL属性或明确的DEFAULT属性来声明,就会自动声明为DEFAULT '0000-00-00 00:00:00'。对于插入的行,如果没有为该列指定明确的值,那么该列将被分配为'0000-00-00 00:00:00',并且不会发生警告。根据是否启用了严格的SQL mode或包含NO_ZERO_DATE的SQL mode,默认值'0000-00-00 00:00:00'可能是不被允许的。
目标库MySQL 5.7.20的explicit_defaults_for_timestamp值是默认的OFF,结合上述规则,就可以模拟复现上述问题了。
虽然原始的建表语句中TIMESTAMP类型字段包含了NULL和DEFAULT属性,但是根据同步软件的错误提示,很明显,不知道什么原因,他在执行的时候忽略了这两个属性,导致真实的执行语句是,
create table test(
id int not null,
createtime timestamp,
updatetime timestamp
我们在客户端,执行上述SQL,就会得到相同的错误信息,
Invalid default value for 'updatetime'
建表语句第一个TIMESTAMP类型字段是createtime,按照上述规则(1),没有明确使用NULL属性声明的TIMESTAMP列会自动使用NOT NULL属性声明,按照上述规则(2),表中的第一个TIMESTAMP列,如果没有明确地用NULL属性,DEFAULT属性或ON UPDATE属性声明,将自动用DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP属性声明,假设这个建表语句中只有一个TIMESTAMP类型字段createtime,他的结构会改成,
按照上述规则(3),在第一个列之后的TIMESTAMP列,即此处的updatetime,如果没有明确地用NULL属性或明确的DEFAULT属性来声明,就会自动声明为DEFAULT '0000-00-00 00:00:00',但是这个MySQL 5.7.20的sql_mode变量包含了NO_ZERO_DATE规则,因此默认值'0000-00-00 00:00:00'不被允许,所以提示了错误,
Invalid default value for 'updatetime'
我们能推断,如果表中存在两个及以上这种情况的TIMESTAMP类型字段,通过这个软件做同步,建表的时候,就会报错,这个可能是软件的一个bug,或者存在其他的配置控制,但就不在数据库的范畴了。
另外,多说一点,原始语句中createtime和updatetime列都指定了默认值,但还是设置NULL属性,这其实就有些矛盾了,或者说是设计上的不严谨,从规范设计开发的角度,还是应该避免的,
create table test(
id int not null auto_increment,
createtime timestamp null default current_timestamp,
updatetime timestamp null default current_timestamp on update current_timestamp
小白学习MySQL,
《小白学习MySQL - 聊聊数据备份的重要性
《小白学习MySQL - InnoDB支持optimize table?
《小白学习MySQL - table_open_cache的作用
《小白学习MySQL - 表空间碎片整理方法
《小白学习MySQL - 大小写敏感问题解惑
《小白学习MySQL - only_full_group_by的校验规则
《小白学习MySQL - max_allowed_packet》
《小白学习MySQL - mysqldump保证数据一致性的参数差异
《小白学习MySQL - 查询会锁表?》
《小白学习MySQL - 索引键长度限制的问题
《小白学习MySQL - MySQL会不会受到“高水位”的影响?
《小白学习MySQL - 数据库软件和初始化安装
《小白学习MySQL - 闲聊聊
近期更新的文章:
《MySQL的几种常用存储引擎
《创建PDB的两种操作
《Oracle中执行truncate操作出现hang
《最近碰到的一些问题
《尝试个Oracle在线实训环境
《Java文件写入的6种方法
文章分类和索引:
《公众号800篇文章分类和索引
原文链接:https://mp.weixin.qq.com/s?__biz=MzI2NzM1OTM4OA==&mid=2247494080&idx=1&sn=29d91d30dbe43ea7a80557396a00ed4c&chksm=ea82ac33ddf525255193fab7f881fae18e63330ac758937176636e5c59393de1894460c0290c&scene=126&&sessionid=0
问题:使用Navicat for MySQL导表时出错
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(0) NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
MySQL版本低更换高的就行,我原来使用的时5.5的,更换为5
一般建表时候,创建时间用datetime,更新时间用timestamp。这是非常重要的。
千万注意的是一个表中出现了两个timestamp字段类型:我测试了一下,如果你的表中有两个timestamp字段,只要你更新任何非timestamp字段的值,则第一个timestamp列会更新成当前时间,而第二人timestamp列的值不变。
如图中我的操作,即使我没有设置request_time属性为ON UPDATE CURRENT_TIMESTAMP,也会自动更新,你就说坑不坑!!!
一般建表时候,创建时间用datetime,更新时间用timestamp。这是非常重要的。我测试了一下,如果你的表中有两个timestamp字段,只要你更新任何非timestamp字段的值,则第一个timestamp列会更新成当前时间,而第二人timestamp列的值不变。————————————————————————-MySQL5日期类型DATETIME和TIMESTAMP 相关问题详解MySQ...
大家好,我是架构摆渡人。这是实践经验系列的第七篇文章,这个系列会给大家分享很多在实际工作中有用的经验,如果有收获,还请分享给更多的朋友。
今天给大家分享一个容易忽略的问题,正是因为容易忽略,所以才要重视。
我们的业务表中有两个字段是必不可少的,分别是创建时间和修改时间,这样就知道数据是什么时候创建的,最后一次的修改时间是什么时候。
就是经常会在修改时间上看到这个语句ON UPDATE CURRENT_TIMESTAMP,SQL语句如下:
`update_time` timestamp NULL DEFAUL
方法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 `
项目出现如下错误:
Error updating database.
Cause:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'createTime' cannot be null
数据模型如下:
/* 创建时间不可为空*/
createTime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' ,
https://blog.csdn.net/wanbeila/article/details/89296900?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id=1328666.7686.16
alter table t_user_channel_info change update_dttm update_dttm timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP();
ALTER TABLE t_user_info MODIFY COLUMN update_dttm datetime NULL DEFAULT CURRENT_TIM...
表示每次更新这条数据的时候,该字段都会更新成当前时间
这两个操作是mysql数据库本身在维护,所以可以根据这个特性来生成【创建时间】和【更新时间】两个字段,且不需要代码来维护
```language
CREATE TABLE `TEST_CURRENT_TIMESTAMP` (
`fawen`..
TIMESTAMP在MySQL5.5中的行为:
1.第一个未设置默认值的TIMESTAMP NOT NULL字段隐式默认值:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
2.后面未设置默认值的TIMESTAMP NOT NULL字段隐式默认值:0000-00-00 00:00:00
3.不支持多个CURRENT_TIMESTAMP 默认值5....
explicit_defaults_for_timestampMySQL 5.6版本引入explicit_defaults_for_timestamp来控制对timestamp NULL值的处理如果该参数不开启,则对timestamp NOT NULL插入NULL值,不报错,无warning,插入后的值为当前时间如果在my.cnf中explicit_defaults_for_timestamp=1...
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
#开启查询缓存
explicit_defaults_for_timestamp=true
CURRENT_TIMESTAMP()可以把MYSQL中TIMESTAMP类型设置为当前的时间。
ON UPDATE个人觉得这个是个神器,一般用于当某个字段是updateTIme,最后修改时间的时候,使用这个ON UPDATE即可。这样就不用开发者自己去处理了,MySQL能自动将其处理。
最后来说下索引,这个是来源于百度,具体是谁的,我...
Mysql建表时,当某字段类型为timestamp时,可以设置其默认值为CURRENT_TIMESTAMP.
默认值为CURRENT_TIMESTAMP,表示在insert一条记录时,此时的值自动设置为系统当前时间.一般做创建字段用(create_time),
如果在后面加上 ON UPDATE CURRENT_TIMESTAMP,则时间字段会随着update命令进行实时更新,即当此条数据的其他字...
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。