pg_copy_from不会让我的索引列自行递增,也不会取空值

时间:2014-11-04 22:41:58

标签: php arrays postgresql insert

我想用一个数组来使用pg_copy_from填充pgsql表。但是,如果我没有为我的序列index列提供信息,则会收到以下错误消息。

ERROR: there is data for a column index

如何强制pg_copy_from忽略我的索引列,让它独立递增。因为它需要以逗号分隔的值,我尝试这样做一段时间,在索引的位置传递一个空白字符串:

array_walk($logs, function(&$record) { 
    "'', " . $record; 
});

但它没有用。我也尝试制作一个index是第二列的表,我没有传递第二个值,但我收到了同样的错误。这有选择吗?

2 个答案:

答案 0 :(得分:0)

<强>声明即可。我不是一个PHP开发人员,但听起来你可能只需要在你的“索引”列中插入单词DEFAULT(我假设这在你的主键中并且它有一个音序器)。例如:

create temp table foobar(id serial, foo text);
insert into foobar values (DEFAULT, 'hello');
insert into foobar values (DEFAULT, 'world');
select * from foobar;
+----+-------+
| id |  foo  |
+----+-------+
|  1 | hello |
|  2 | world |
+----+-------+
(2 rows)

答案 1 :(得分:0)

pg_copy_from不允许您排除某些列。由于您自己的COPY语句,pg_query和pg_put_line的组合允许这样做:

<?php 
  $conn = pg_pconnect("dbname=foo");
  pg_query($conn, "create table bar (a serial, b char(16), d float8)"); // just an example
  pg_query($conn, "copy bar(b, c) from stdin"); // only columns b and c !
  pg_put_line($conn, "hello world\t4.5\n");
  pg_put_line($conn, "goodbye world\t7.11\n");
  pg_put_line($conn, "\\.\n");
  pg_end_copy($conn);
?>