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

时间: 2024-12-16 16:19:00

mysql数据导入遇到的timestamp类型问题的相关文章

mysql数据导入到sqlite数据

在做程序时,sqlite数据很方便.用mysql数据导出到sqlite的步骤:(用csv文件过渡) -------------------------------  先导出到csv文件  ------------------------- 1.用navicat软件将mysql数据导出到txt文件. 2.注意选择“包含列标题”(字段名).“栏位定界符”(csv文件使用逗号). 3.把所有的txt文件转换为utf-8编码. 4.写一个rename.bat(ren *.txt *.csv),全部统一改

使用 sqoop 将mysql数据导入到hive(import)

Sqoop 将mysql 数据导入到hive(import) 1.创建mysql表 CREATE TABLE `sqoop_test` ( `id` int(11) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, `age` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 插入数据 2.hive 建表 hive> create external table sqoop_test

Sqoop将mysql数据导入hbase的血与泪

Sqoop将mysql数据导入hbase的血与泪(整整搞了大半天)  版权声明:本文为yunshuxueyuan原创文章.如需转载请标明出处: https://my.oschina.net/yunshuxueyuan/blogQQ技术交流群:299142667 一. 问题如何产生 庞老师只讲解了mysql和hdfs,mysq与hive的数据互导,因此决定研究一下将mysql数据直接导入hbase,这时出现了一系列问题. 心酸史: 二. 开始具体解决问题 需求:(将以下这张表数据导入mysql)

使用sqoop将mysql数据导入到hive中

首先准备工具环境:hadoop2.7+mysql5.7+sqoop1.4+hive3.1 准备一张数据库表: 接下来就可以操作了... 一.将MySQL数据导入到hdfs 首先我测试将zhaopin表中的前100条数据导出来,只要id.jobname.salarylevel三个字段. 再Hdfs上创建目录 hadoop fs -mkdir -p /data/base #用于存放数据 我们cd到sqoop目录下执行命令 # \ 用于换行bin/sqoop import --connect jdbc

18 MySQL数据导入导出方法与工具介绍之二

批处理是一种非交互式运行mysql程序的方法,如同您在mysql中使用的命令一样,你仍然将使用这些命令. 为了实现批处理,您重定向一个文件到mysql程序中,首先我们需要一个文本文件,这个文本文件包含有 与我们在mysql中输入的命令相同的文本.比如我们要插入一些数据,使用包含下面文本的文件(文件名为New_Data.sql,当然我们也可以取名为 New_Data.txt及任何其他的合法名字,并不一定要以后缀sql结尾):USE Meet_A_Geek;INSERT INTO Customers

16 MySQL数据导入导出方法与工具介绍之一

1).mysqlimport的语法介绍:mysqlimport位于mysql/bin目录中,是mysql的一个载入(或者说导入)数据的一个非常有效的工具.这是一个命令行工具.有两个参数以及大量的选项可供选择.这个工具把一个文本文件(text file)导入到你指定的数据库和表中.比方说我们要从文件Customers.txt中把数据导入到数据库Meet_A_Geek中的表Custermers中:mysqlimport Meet_A_Geek Customers.txt注意:这里Customers.

使用Sqoop将MySql数据导入到HDFS

##以上完成后在h3机器上配置sqoop-1.4.4.bin__hadoop-2.0.4-alpha.tar.gz //将宿主机上MySql的test库中的users表的数据导入到HDFS,默认Sqoop会起4个Map运行MapReduce进行导入到HDFS,存放在HDFS路径为/user/root/users(user:默认用户,root:MySql数据库的用户,test:表名)目录下有四个输出文件sqoop import --connect jdbc:mysql://192.168.1.10

使用sqoop将mysql数据导入到hadoop

hadoop的安装配置这里就不讲了. Sqoop的安装也很简单. 完成sqoop的安装后,可以这样测试是否可以连接到mysql(注意:mysql的jar包要放到 SQOOP_HOME/lib 下): sqoop list-databases --connect jdbc:mysql://192.168.1.109:3306/ --username root --password 19891231 结果如下 即说明sqoop已经可以正常使用了. 下面,要将mysql中的数据导入到hadoop中.

Mysql数据导入测试

1. 背景 导入150w数据到mysql,数据格式为tab分隔csv文件.测试索引对导入速度的影响 2. 无索引,导入数据后重建 CREATE TABLE `tab` ( `ct_id` char(36) DEFAULT NULL COMMENT 'id', `ct_title` varchar(200) DEFAULT NULL COMMENT '标题', `bd_id` int(11) DEFAULT NULL COMMENT 'bdid', `org_unit` int(11) DEFAU