如何让 redshift 为复制命令中指定的字段添加当前时间

问题描述 投票:0回答:2

我有一个 TSV 文件,我想通过复制命令将其加载到 redshift 中。

我希望表中的字段之一是时间戳,用于记录加载行的时间。

我定义了一个这样的字段:

ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP

如果我在 psql 命令行插入此行,而不指定此列的值,则效果很好 - 它默认为预期的当前时间戳。

但是,我的 TSV 文件中该列中的哪些内容会导致红移默认为当前时间戳?

如果我在 TSV 中使用

\N
,那么我只会在 ts 字段中得到 NULL。

另一方面,如果我将列定义为 NOT NULL

ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL

然后我从 COPY 命令中收到错误,无法将 NULL 值插入 NOT NULL 字段。

在 mysql 上,mysql 会将 NULL 值转换为当前时间戳,但 redshift 的行为是抛出错误。

有什么建议吗?非常感谢!

amazon-redshift
2个回答
0
投票

我已经为此苦苦思索了一段时间,并找到了一个部分解决方法:您可以将

ts
列作为表的最后一列,并将 TSV 文件与除这一列之外的所有其他列一起使用。该文件将使用存在的列进行读取,并加载到目标表中具有相同宽度的连续列列表中,将超出该宽度的所有列保留为默认值,即您可以拥有
id | ts
表并使用以下命令加载文件仅
id
ts
将采用默认值。当前时间戳列通常是元数据列,因此可以将其放置在表的末尾。


0
投票

直接使用复制命令我们无法上传表格。有两种方法可以做到同样的事情:

  1. 将数据加载到临时表中(如果使用任何 AWS 服务),然后更新目标表。

    “INSERT INTO schema.target_table(除 current_date 之外的所有列的列表) 全选 * 来自临时表;” 2.使用复制命令选择除“current_date”之外的所有列并执行该语句。

注意: 如果不想手动列出所有列名称,则可以从 information_schema.columns 中提供 table_schematable_name 来列出所有列名称。

© www.soinside.com 2019 - 2024. All rights reserved.