我有一个 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 的行为是抛出错误。
有什么建议吗?非常感谢!
我已经为此苦苦思索了一段时间,并找到了一个部分解决方法:您可以将
ts
列作为表的最后一列,并将 TSV 文件与除这一列之外的所有其他列一起使用。该文件将使用存在的列进行读取,并加载到目标表中具有相同宽度的连续列列表中,将超出该宽度的所有列保留为默认值,即您可以拥有 id | ts
表并使用以下命令加载文件仅 id
,ts
将采用默认值。当前时间戳列通常是元数据列,因此可以将其放置在表的末尾。
直接使用复制命令我们无法上传表格。有两种方法可以做到同样的事情:
将数据加载到临时表中(如果使用任何 AWS 服务),然后更新目标表。
“INSERT INTO schema.target_table(除 current_date 之外的所有列的列表) 全选 * 来自临时表;” 2.使用复制命令选择除“current_date”之外的所有列并执行该语句。
注意: 如果不想手动列出所有列名称,则可以从 information_schema.columns 中提供 table_schema 和 table_name 来列出所有列名称。