我有一个Timestamp
字段,定义为使用CURRENT_TIMESTAMP
值自动更新
当我触发查询时它工作正常,但是当我导入一个csv(由于其中一个字段是longtext而我不得不这样做)时,更新不起作用。
我试过:
now()
函数
2013-08-08
之类的时间戳
醇>
这两种方法都不起作用
答案 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_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也许值得快速查看。