2011-03-14 37 views
1

我有一个rails应用程序,我试图通过PostgreSQL的COPY命令将数据加载到它。该文件是CSV。该表映射到Rails模型,我需要保留主键ID列,以便我可以使用model.for_each来处理数据 - 表中将有5M +行。带有ID列的COPY CSV文件

我的问题是,我如何构造我的CSV,以便我可以将数据加载到表中,并仍然允许ID列在那里?这是一个无赖,因为我需要它的唯一原因是for_each方法。

无论如何,我试图发送空值,如:

NULL,col1,col2,col3,col4, etc. 

但它不工作。

谢谢。

+0

哎呀。我正在尝试'\ N'来传递NULL。也许我过去的MS-SQL日子是这里的问题。备用... – 2011-03-14 20:52:05

+0

没有。 \ N也没有工作。 – 2011-03-14 20:57:53

回答

3

传入null主键会不管你为空字符串设置了什么选项都不会工作。您将告诉后端将主键设置为null,无论插入的命令是什么,它都不会允许。

我真的不知道你的意思是保留主键。无论做什么,这都会得到保留。如果你的意思是让DB挑选价值为你的主键是一个串口(自动递增),然后明确命名所有列,但主键:

COPY country (colA, colB, colC) FROM '/usr1/proj/bray/sql/country_data'; -- leave out pkey 

它也可能更快地阅读文档什么空字符串选择您想使用的,而不是猜测可能的值:

http://www.postgresql.org/docs/9.0/static/sql-copy.html

+0

谢谢。这很有帮助。如果你看到我对我的问题的评论,是的,你是完全正确的。我认为它是'NULL'而不是'\ N'。谢谢。你知道当你认为会发生什么...... – 2011-03-14 21:46:33

+0

有趣!由于我读过的文档(咧嘴笑)说,表格和CSV文件之间必须有一对一的列映射。这让我觉得我必须考虑到ID列,并且无法做你正在说的话。我会尝试。再次感谢! – 2011-03-14 21:48:47

+0

这是有效的。非常感谢。 – 2011-03-15 00:38:25

1

默认使用WITH CSV时是不带引号的空字符串,如:

,col1,col2,col3,,col5 

这将创建一个看起来记录,如:

NULL,'col1','col2','col3',NULL,'col5' 
+0

尝试使用此结果:错误:列“id”中的空值违反了非空约束 – 2011-03-14 21:35:31

+0

即使引入了NULL,您仍然必须遵守主键约束。您必须调整架构或数据以兼容。 – 2011-03-15 12:37:47

相关问题