这基本上是this与s/mysql/postgresql/g
的重复。
我创建了一个包含timestamp TIMESTAMP
列的表,我正在尝试从具有Unix时间戳行的CSV
文件中导入数据。
但是,当我尝试将COPY
文件放入表格时,我得到了错误
2:1: conversion failed: "1394755260" to timestamp
3:1: conversion failed: "1394755320" to timestamp
4:1: conversion failed: "1394755800" to timestamp
5:1: conversion failed: "1394755920" to timestamp
显然,如果我将列设置为INT
,这是有效的。
在MySQL变体中,我解决了一个伎俩
LOAD DATA LOCAL INFILE 'file.csv'
INTO TABLE raw_data
fields terminated by ','
lines terminated by '\n'
IGNORE 1 LINES
(@timestamp, other_column)
SET timestamp = FROM_UNIXTIME(@timestamp),
third_column = 'SomeSpecialValue'
;
请注意两件事:我可以使用函数将CSV文件中的@timestamp
变量映射为适当的DATETIME
,并且我可以将额外的列设置为特定值(这是必要的,因为我在数据库中有比CSV更多的列)。
我正在切换到postgresql,因为mysql缺少一些函数,这些函数使我需要编写的查询变得更加容易。
有没有办法配置表,以便自动进行转换?
我认为您可以通过按原样导入数据,使用转换后的时间戳创建第二列,然后使用触发器确保插入行的任何时间填充新列来实现此目的:
alter table raw_table
add column time_stamp timestamp;
CREATE OR REPLACE FUNCTION raw_table_insert()
RETURNS trigger AS
$BODY$
BEGIN
NEW.time_stamp = timestamp 'epoch' + NEW.unix_time_stamp * interval '1 second';
return NEW;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
CREATE TRIGGER insert_raw_table_trigger
BEFORE INSERT
ON raw_table
FOR EACH ROW
EXECUTE PROCEDURE raw_table_insert();
如果可以修改时间戳列,那么您还需要确保触发器也适用于更新。
或者,您可以创建一个动态生成时间戳的视图,但优点/缺点取决于您在列上搜索的频率,表格的大小以及您期望的DML大小。