我有一个Timestamp
定义为使用值自动更新的CURRENT_TIMESTAMP
字段。
当我触发查询时它工作正常,但是当我导入 csv 时(我被迫这样做,因为其中一个字段是 longtext),更新不起作用。
我试图:
- 将时间戳列作为
now()
csv中的函数 2013-08-08
像在 csv 中一样手动输入时间戳
这两种方法都不起作用
我有一个Timestamp
定义为使用值自动更新的CURRENT_TIMESTAMP
字段。
当我触发查询时它工作正常,但是当我导入 csv 时(我被迫这样做,因为其中一个字段是 longtext),更新不起作用。
我试图:
now()
csv中的函数2013-08-08
像在 csv 中一样手动输入时间戳这两种方法都不起作用
根据我收集的信息,在更新您的问题后,您实际上是在使用 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
默认值是0
which ,因为字段类型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 上,但最好准备好官方手册。一旦你习惯了它就不错了。
也许这个问题也值得一看。