there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT

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类型,可以使用 datetime
DROP 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:

1. 占用8个字节
2. 允许为空值,可以自定义值,系统不会自动修改其值。

3. 实际格式储存

4. 与时区无关

5. 不可以设定默认值,所以在不允许为空值的情况下,必须手动指定datetime字段的值才可以成功插入数据。
6. 可以在指定datetime字段的值的时候使用now()变量来自动插入系统的当前时间。
结论:datetime类型适合用来记录数据的原始的创建时间,需要手动更新时间,否则datetime字段的值都不会改变。

timestamp:
1. 占用4个字节
2. 允许为空值,但是不可以自定义值,所以为空值时没有任何意义。
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(),即当前的系统时间。
7. 数据库会自动修改其值,所以在插入记录时不需要指定timestamp字段的名称和timestamp字段的值,你只需要在设计表的时候添加一个timestamp字段即可,插入后该字段的值会自动变为当前系统时间。
8. 以后任何时间修改表中的记录时,对应记录的timestamp值会自动被更新为当前的系统时间。
结论:timestamp类型适合用来记录数据的最后修改时间,因为只要你更改了记录中其他字段的值,timestamp字段的值都会被自动更新。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章