【问题标题】:PostgreSQL COPY command issuesPostgreSQL COPY 命令问题
【发布时间】:2011-11-14 15:23:58
【问题描述】:

在我的 Postgresql 数据库中,我创建了一个名为 NAV_DATA 的表,其中包含五列:

 id (PKEY)
,name (VARCHAR)
,call_type (VARCHAR)
,date_created (date)

对于这些列,我有分隔符 TAB \t 和 Quotechar " 的 csv 文件。
它的中间列也有一些空字段。

如何允许在复制命令中接受空值?

我想插入列(name, call_type, date_created)。我的 csv 中没有 id 字段。

如何将特定列复制到数据库中?

问题还在于分隔符 TAB \t?

【问题讨论】:

  • 请查看手册的appropriate page,如果您发现任何不清楚的地方,请修改您的问题。
  • 你提到“5列”,但只显示4?

标签: python postgresql csv postgresql-copy


【解决方案1】:
copy "NAV_DATA" (name,call_type,date_created) from 'c:/test.txt' with delimiter '\t' csv

【讨论】:

  • 我认为表名不应该用引号引起来。问题是主键ID是否会为每条记录自动递增?
  • Postgres 对表名和列名区分大小写,除非被 qoutes 包围,否则它将转换为小写。这将意味着 NAV_DATA 不会匹配名为 NAV_DATA 的表。您必须在查询中填写“NAV_DATA”。
  • 您可以使用 Erwin 建议的序列。就个人而言,当我导入 CSV 时,我会导入与 CSV 结构匹配的表,然后使用 SQL 查询将导入的脏表复制到我的干净表中。通过这种方式,您可以修剪空格、设置 NULL、创建序列并运行查询 DISTINCT 以消除重复。
【解决方案2】:

如果您想知道NULL 值在 CSV 文件中是如何表示的,请查看@Milen 在他的评论中链接到的手册页面。或者将一些测试数据(包括NULL 值)写入您的表中并使用COPY TO 将其导出。您将得到 COPY FROM 所期望的格式。

在标准格式中NULL\N 表示,在标准CSV 格式中由分隔符之间的nothing 表示。 COPY 命令中未提及的列将使用各自的默认值填充。

例如,串行列(可能像id)将从每一行的关联序列中获得nextval()。如果id 还没有默认值,则使用create a sequence 并将nextval('my_sequence_name') 设为默认值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    相关资源
    最近更新 更多