2017-10-13 24 views
0

我有一个INTEGER列具有NOT NULL约束和DEFAULT值= 0;PostgreSQL:从csv缺失值复制到一个列与NOT NULL约束

我需要从一系列csv文件中复制数据。

在其中一些文件中,此列是一个空字符串。

到目前为止,我已经将COPY命令中的NULL参数设置为某个不存在的值,所以空字符串不会被转换为NULL值,但现在我收到一个错误,指出INTEGER列的空字符串值不正确。

我想使用COPY命令,因为它的速度,但也许这是不可能的。 该文件不包含标题。文件中的所有列都有表中的对应项。

它有办法规定:

  1. 空刺痛为零,或

  2. 如果有恩空字符串使用默认的列值?

+0

你的意思是空串如''?然后问题是类型不匹配。如果列只是空的,你的设置默认为0应该可以正常工作'123,,456等'。 –

+0

是的,我认为问题在于你说的类型不匹配,但由于某种原因它不起作用。我没有使用postgreSQL的经验,但在我看来,COPY就像是BULK insert,并且没有违约行为。我已经实现了一个解决方法,我使用允许NULL的临时表,然后将所有NULL更新为默认值,最后将记录插入到目标表中。我可以在明天发布工作示例以及文件示例 –

回答

0

您可以创建在不包含列,并在其上创建一个INSTEAD OF INSERT触发器表的视图。当您将COPY数据放入该视图中时,将使用该表的默认值。不知道表现是否足够好。

+0

感谢您的建议。目前,我转向其他workaroud。 TEMP TABLE + UPDATE + INSERT(请参阅原文中的我的评论)。重要的问题是应该使用默认值与COPY操作,COPY中明确提及列以及如何避免类型不匹配。 –