加载CSV时设置插入时间戳

时间:2013-08-07 10:53:10

标签: mysql phpmyadmin

我有一个Timestamp字段,定义为使用CURRENT_TIMESTAMP值自动更新 当我触发查询时它工作正常,但是当我导入一个csv(由于其中一个字段是longtext而我不得不这样做)时,更新不起作用。

我试过:

  1. 在csv
  2. 中将时间戳列作为now()函数
  3. 在csv
  4. 中手动输入2013-08-08之类的时间戳

    这两种方法都不起作用

1 个答案:

答案 0 :(得分:1)

根据我收集的内容,在更新问题之后,您实际上是使用CSV 更新行,并期望ON UPDATE子句将时间戳字段的值设置为更新。
遗憾的是,将CSV加载到数据库时,您没有更新,而是插入数据,并覆盖现有记录。至少,当使用LOCAL INFILE时,如果INFILE不是本地的,查询将产生错误,如果它是本地文件,这些错误(重复)将产生警告并且操作将继续

如果您不是这种情况,可以考虑following one of the examples on the doc pages

LOAD DATA INFILE 'your.csv'
   INTO TABLE tbl
      (field_name1, field_name2, field_name3)
   SET updated = NOW()
FIELDS TERMINATED BY ','
       OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY ('\n');

万一你不能/不会/忘记添加其他信息,在MySQL表中加载csv int非常容易:

LOAD DATA
   LOCAL INFILE '/path/to/file/filename1.csv'
INTO TABLE db.tbl
    FIELDS TERMINATED BY ','
    OPTIONALLY ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
(`field_name1`,`field_name2`,`field_name3`)

如果您创建一个表格:

CREATE TABLE tbl(
   id INT AUTO_INCREMENT PRIMARY KEY, -- since your previous question mentioned auto-increment
   field_name1 VARCHAR(255) NOT NULL PRIMARY KEY, -- normal fields
   field_name2 INTEGER(11) NOT NULL PRIMARY KEY,
   field_name3 VARCHAR(255) NOT NULL DEFAULT '',
    -- when not specified, this field will receive current_timestamp as value:
   inserted TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
   -- if row is updated, this field will hold the timestamp of update-time
   updated TIMESTAMP NOT NULL DEFAULT 0
                              ON UPDATE CURRENT_TIMESTAMP
)ENGINE = INNODB
 CHARACTER SET utf8 COLLATE utf8_general_ci;

此查询未经测试,因此请小心,它只是为了大致了解您需要做什么才能获得插入时间戳。
此示例表将如下工作:

> INSERT INTO tbl (field_name1, field_name2) VALUES ('foobar', 123);
> SELECT FROM tbl WHERE field_name1 = 'foobar' AND field_name2 = 123;

这将显示:

+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+
|          id         |     field_name1     |     field_name2     |     field_name3     |       inserted      |       updated       |
+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+
|           1         |        foobar       |         123         |                     | 2013-08-07 00:00:00 | 0000-00-00 00:00:00 |
+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+

如您所见,因为我们没有在最后三个字段中显式插入值,所以MySQL使用了DEFAULT值。对于field_name3,使用空字符串,inserted,默认值为CURRENT_TIMESTAMPupdated默认值为0,因为字段 - 类型TIMESTAMP由值0000-00-00 00:00:00表示。如果您接下来要运行以下查询:

UPDATE tbl
   SET field_name3 = 'an update'
WHERE field_name1 = 'foobar'
  AND field_name2 = 123
  AND id          = 1;

该行看起来像这样:

+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+
|          id         |     field_name1     |     field_name2     |     field_name3     |       inserted      |       updated       |
+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+
|           1         |        foobar       |         123         |      an update      | 2013-08-07 00:00:00 | 2013-08-07 00:00:20 |
+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+

就是这样。可以找到一些基础知识here, on mysqltutorial.org,但最好保留the official manual ready。一旦你习惯它,这还不错 也许this question也许值得快速查看。