zoukankan      html  css  js  c++  java
  • mysql数据导入遇到的timestamp类型问题

    今天准备把最新的表导入自己以前的机子上做临时开发,在数据库导入的时候遇到一个问题:Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

    更具导入的日志提示是:表的错误定义;在一个表中只能有一个列指定为TIMESTAMP类型的列,并且使用CURRENT_TIMESTAMP 作为默认值或者是使用 ON UPDATE 子句。以前真没有遇到过这个问题。。。是我操作数据库少啊。。

    搜索一下大部分说是应为我的数据库版本是在5.6之后。。我看了下我本地的mysql的版本。原来我用的还是以前的5.5。。应该就是这个原因了。。。只要找到原因就有办法解决:打开要操作的sql文件,可以看到如下:确实在一个表中定义了有两列定义成了TIMESTAMP类型。

    转载别人的解决方法如下:

    注:本文讨论的范围为未启用MAXDB模式的表!

        今天建了一个表,里面有一个列是timestamp类型,我本意是在数据更新时,这个字段的时间能自动更新。岂知对这个类型的值还不甚了解,导致出错。发现这个字段只是在这行数据建立的时候有值,在更新的却无变化。

        查找资料,发现是我建表的语句有问题:

    CREATE TABLE `test` (
      `t1` timestamp NOT NULL default CURRENT_TIMESTAMP,
      `ww` varchar(5) NOT NULL
    ) ENGINE=MyISAM ;

      而实际上,以下两个建表语句的效果是一样的:

    CREATE TABLE `test` (
    `t1` TIMESTAMP NOT NULL ,
    `ww` VARCHAR( 5 ) NOT NULL
    ) ENGINE = MYISAM
    CREATE TABLE `test` (
      `t1` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
      `ww` varchar(5) NOT NULL
    ) ENGINE=MyISAM ;

    比较之下,我的语句少了“on update CURRENT_TIMESTAMP”或多了“default CURRENT_TIMESTAMP”。如此一来,这个timestamp字段只是在数据insert的时间建立时间,而update时就不会有变化了。当然,如果你就是想达到这个目的倒也无所谓。

        查找英文手册(http://dev.mysql.com/doc/refman/5.1/en/timestamp.html),得到更详细的解说,翻译如下:

    -----------------------------------翻译开始--------------------------------

        在CREATE TABLE语句中,第1个TIMESTAMP列可以用下面的任何一种方式声明:

        1: 如果定义时DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP子句都有,列值为默认使用当前的时间戳,并且自动更新。

        2: 如果不使用DEFAULT或ON UPDATE子句,那么它等同于DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。

        3: 如果只有DEFAULT CURRENT_TIMESTAMP子句,而没有ON UPDATE子句,列值默认为当前时间戳但不自动更新。

        4: 如果没用DEFAULT子句,但有ON UPDATE CURRENT_TIMESTAMP子句,列默认为0并自动更新。

        5: 如果有一个常量值DEFAULT,该列会有一个默认值,而且不会自动初始化为当前时间戳。如果该列还有一个ON UPDATE CURRENT_TIMESTAMP子句,这个时间戳会自动更新,否则该列有一个默认的常量但不会自动更新。

        换句话说,你可以使用当前的时间戳去初始化值和自动更新,或者是其中之一,也可以都不是。(比如,你在定义的时候可以指定自动更新,但并不初始化。)下面的字段定义说明了这些情况:

    自动初始化和更新:
    ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    只自动初始化:
    ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    只自动更新
    ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP
    只是给一个常量(注:0000-00-00 00:00:00)
    ts TIMESTAMP DEFAULT 0

    -----------------------------------翻译结束--------------------------------

        上面我用红色字体标出了"第1个TIMESTAMP列",这是因为,一个表有多个timestamp列的话,定义起来是不一样的。

        比如上面的第二条:“如果不使用DEFAULT或ON UPDATE子句,那么它等同于DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。”如果是第二个timestamp列就不一样了,请看:

    CREATE TABLE `test` (
    `ww` VARCHAR( 9 ) NOT NULL ,
    `t1` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
    `t2` TIMESTAMP NOT NULL
    ) ENGINE = MYISAM

    这个情况下,数据插入时,t1会记录当前时间,t2为默认值(0000-00-00 00:00:00),等同下面的语句:

    CREATE TABLE  `test` (
    `ww` VARCHAR( 9 ) NOT NULL ,
    `t1` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
    `t2` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00'
    ) ENGINE = MYISAM

    而根据上面的第二条,应该是:

    CREATE TABLE `test` (
    `ww` VARCHAR( 9 ) NOT NULL ,
    `t1` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
    `t2` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
    ) ENGINE = MYISAM

    但实际上,上面的语句是个语法错误,mysql会返回:

    #1293 - Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

    我曾经想这样设计一个表,这个表有两个timestamp列,一个可以记录更新时间,一个可以记录初始时间,但是尝试多次以后,我发现mysql好像做不到这一点,不知道这个是mysql的缺陷还是自我优化,因为,这个功能可以使用datetime实现记录初始化的时间,只是需要insert的时候指定一下。

    转自:http://blog.sina.com.cn/s/blog_49a665e10100cb52.html

  • 相关阅读:
    Brain network involved in autonomic functions 与自主功能相关的大脑网络
    Brief summary of classical components of ERP 事件相关成分(ERP)经典成分小结
    ICA & Percentage Variance Account For (PVAF)
    数据处理中白化Whitening的作用图解分析
    Loadings vs eigenvectors in PCA 主成分分析(PCA)中的负荷和特征向量
    主成分分析(PCA)和独立成分分析(ICA)相关资料
    Sketch of heart and QRS complex 心脏及QRS波群简图
    Brain Network visulation in EEG 脑电网络可视化
    Phase Locking Value (PLV) 神经信号的锁相值
    ubuntu16.04下的一些基本操作笔记
  • 原文地址:https://www.cnblogs.com/duhuo/p/6036771.html
Copyright © 2011-2022 走看看