0

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

我试图:

  1. 将时间戳列作为now()csv中的函数
  2. 2013-08-08像在 csv 中一样手动输入时间戳

这两种方法都不起作用

4

1 回答 1

1

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

如果您不是这种情况,也许可以考虑遵循文档页面上的示例之一

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默认值是0which ,因为字段类型TIMESTAMP由 value 表示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 |
+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+

就这样。一些基础知识可以在这里找到,在 mysqltutorial.org 上,但最好准备好官方手册。一旦你习惯了它就不错了。
也许这个问题也值得一看。

于 2013-08-07T11:20:40.967 回答