我有一个Timestamp
定义为使用 CURRENT_TIMESTAMP
自动更新的字段值。
当我触发查询时,它工作正常,但是当我导入 csv(由于其中一个字段是长文本,所以我被迫这样做)时,更新不起作用。
我尝试过:
- 将时间戳列指定为
now()
csv 中的函数 - 手动输入时间戳,如
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/