Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause解决:
执行的建表语句:
CREATE TABLE `parameter` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '资源ID,自增主键',
`parameter_key` varchar(64) NOT NULL COMMENT 'KEY值',
`parameter_name` varchar(64) NOT NULL COMMENT '属性NAME',
`parameter_value` varchar(512) NOT NULL COMMENT 'VALUE值',
`created_tm` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modify_tm` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='parameter';
[Err] 1293 - Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
问题描述:
定义表的时候出现问题,是创建新表的时候出错了。报错的意思就是只能有一个类型为CURRENT_TIMESTAMP的列存在。`created_tm` timestamp 和 `modify_tm`都是TIMESTAMP类型。
原因:
使用的mysql版本是5.5的,5.5版本不支持在一个表里存在2个TIMESTAMP 类型的列。如果有两个TIMESTAMP 类型的列,当你给一个timestamp设置为CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP的时候,其他的TIMESTAMP 字段需要显式设定default值。
解决方案:
1.将自己的mysql版本升级到5.6以上。
2. 只给一个列设置TIMESTAMP 类型。
CREATE TABLE `parameter` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '资源ID,自增主键',
`parameter_key` varchar(64) NOT NULL COMMENT 'KEY值',
`parameter_name` varchar(64) NOT NULL COMMENT '属性NAME',
`parameter_value` varchar(512) NOT NULL COMMENT 'VALUE值',
`created_tm` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
`modify_tm` VARCHAR(14) NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='parameter';
3.除了第一个TIMESTAMP 类型的字段外,其他的TIMESTAMP 字段需要显式设定default值。
CREATE TABLE `parameter` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '资源ID,自增主键',
`parameter_key` varchar(64) NOT NULL COMMENT 'KEY值',
`parameter_name` varchar(64) NOT NULL COMMENT '属性NAME',
`parameter_value` varchar(512) NOT NULL COMMENT 'VALUE值',
`created_tm` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
`modify_tm` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='parameter';
4.如果不是必须使用TIMESTAMP类型,可以使用 datetimeDROP TABLE IF EXISTS `parameter`;
CREATE TABLE `parameter` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '资源ID,自增主键',
`parameter_key` varchar(64) NOT NULL COMMENT 'KEY值',
`parameter_name` varchar(64) NOT NULL COMMENT '属性NAME',
`parameter_value` varchar(512) NOT NULL COMMENT 'VALUE值',
`created_tm` datetime NOT NULL COMMENT '创建时间',
`modify_tm` datetime NOT NULL COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='parameter';
拓展:TIMESTAMP VS datetime
datatime:
3. 实际格式储存
4. 与时区无关
5. 不可以设定默认值,所以在不允许为空值的情况下,必须手动指定datetime字段的值才可以成功插入数据。1. 占用4个字节
3. TIMESTAMP值不能早于1970或晚于2037。例如'1968-01-01',对于TIMESTAMP值却无效,如果分配对象,时间将被转换为0。
4.值以UTC格式保存。(YYYYMMDD T HHMMSS Z(或者时区标识)。例如,20100607T152000Z,表示2010年6月7号15点20分0秒,Z表示是标准时间,如果表示北京时间,那么就是:20100607T152000+08,其中 “+08” 表示东八区。)
5.时区转化 ,存储时对当前的时区进行转换,检索时再转换回当前的时区。
6. 默认值为CURRENT_TIMESTAMP(),即当前的系统时间。