mysql - 加载 CSV 时设置插入时间戳

标签 mysql phpmyadmin

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

我尝试过:

  1. 将时间戳列指定为 now() csv 中的函数
  2. 手动输入时间戳,如 2013-08-08在 csv 中

这两种方法都不起作用

最佳答案

据我所知,更新您的问题后,您实际上正在使用 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');

以防万一您不能/不会/忘记添加其他信息,加载 csv int MySQL 表非常简单:

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_TIMESTAMP,对于updated,使用默认值为 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也许也值得快速浏览一下。

关于mysql - 加载 CSV 时设置插入时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18101538/

相关文章:

php - 如何允许某些用户下载 phpMyAdmin 中表的部分内容?

html - 瑞典标志不适用于 SQL 查询

mysql - 如何根据另一列重置 id 列

php - 如何在php中的表单向导中显示一项数据?

php - 从 HTML 表单向 MySQL 数据库添加数据

MySQL 查询用 GROUP BY HOUR 填充 NULL 值

php - 在具有来自数据库的循环的表中显示 for 循环变量

php - Mysql 插入 '(撇号)

php - 服务器和客户端指示的 HTTPS 不匹配

phpmyadmin - 让 phpMyAdmin 显示 InnoDB 表的确切记录数?