Re: COPY data into a table with a SERIAL column?

From: Rob Sargent <robjsargent(at)gmail(dot)com>
To: pgsql-general(at)postgresql(dot)org
Subject: Re: COPY data into a table with a SERIAL column?
Date: 2014-10-16 17:42:45
Message-ID: 54400395.2040001@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On 10/16/2014 11:04 AM, Steve Wampler wrote:
> On 10/16/2014 09:42 AM, Rob Sargent wrote:
>> On 10/16/2014 10:33 AM, Steve Wampler wrote:
>>> This is with Postgresql 9.3.5.
>>>
>>> I'm looking at using a COPY command (via jdbc) to do bulk inserts
>>> into a table that
>>> includes a BIGSERIAL column. Is there a way to mark the data in that
>>> column so it gets assigned a new value on entry - akin to the use of
>>> 'default'
>>> in an INSERT? Some of the rows have values for the serial column,
>>> others
>>> don't.
>>>
>>> Or is the only way to use COPY for this task:
>>>
>>> COPY table_name (columnnameA, columnnameB, columnnameD) FROM source;
>>>
>>> where the serial column name is omitted? This wouldn't preserve the
>>> values
>>> for the serial column on rows that have one already.
>>>
>> Doesn't this guarantee collision at some point?
>
> Depends - without the UNIQUE tag on that column it shouldn't matter.
> Or, with a bigserial there's a lot of room to play with. The rows
> with existing
> serial values might all have negative values for that column, for
> example.
>
>> I might add a column to the target table which would contain the
>> "foreign" serial id and give all records the "local"
>> serial. Update local to foreign iff safe and desired.
>
> I don't think this addresses the problem of having entry rows with no
> serial column in them.
No data in the column (null) or no column at all?

I appreciate the vastness of bigserial but I think it starts at 1. Are
negative numbers even allowed? To clarify my suggestion: all incoming
records would get a new "local" big serial and those incoming records
WITH a value would set the "foreign" bigserial though that column would
have to be typed as bigint nullable (this would allow negative values).
That said, according to my test, the supplied bigserial value would get
insert as supplied if not null (without the extra column I suggested)
My test

postgres=# create table t (id bigserial, name text);
CREATE TABLE
postgres=# insert into t values('rjs');
ERROR: invalid input syntax for integer: "rjs"
LINE 1: insert into t values('rjs');
^
postgres=#
postgres=# insert into t (name) values('rjs');
INSERT 0 1
postgres=# select * from t;
id | name
----+------
1 | rjs
(1 row)

postgres=# insert into t (id, name) values(777, 'rjs');
INSERT 0 1
postgres=# select * from t;
id | name
-----+------
1 | rjs
777 | rjs
(2 rows)

>
> Let me generalize the problem a bit: How can I specify that the
> default value of a column
> is to be used with a COPY command when some rows have values for that
> column and
> some don't?
>

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Pavel Stehule 2014-10-16 17:44:46 Re: How to Install Extensions
Previous Message David G Johnston 2014-10-16 17:38:15 Re: COPY data into a table with a SERIAL column?