Обсуждение: How do I create unique IDs for an existing set of records

Поиск
Список
Период
Сортировка

How do I create unique IDs for an existing set of records

От
"Nick Fankhauser"
Дата:
Hi-

There's got to be a simple way to do this, but it's eluding me so far...

I have a table that is already populated with about 600,000 rows.

I have created a new unique id field for it. (alter table test add new_pk
int8 not null;)

I have also createtd a sequence (create sequence test_new_pk)

Now I want to populate the key for all of the existing records.

I tried:

update test set new_pk = (select nextval('test_new_pk_seq'));

but it wants to update *all* of the rows to the current nextval (I was
hoping it would evaluate nextval on each row).

How do I write an update to assign a sequential id for the existing records?

Any ideas appreciated!

-Nick

--------------------------------------------------------------------------
Nick Fankhauser  nickf@ontko.com  Phone 1.765.935.4283  Fax 1.765.962.9788
Ray Ontko & Co.     Software Consulting Services     http://www.ontko.com/



Re: How do I create unique IDs for an existing set of records

От
Tom Lane
Дата:
"Nick Fankhauser" <nickf@ontko.com> writes:
> I tried:

> update test set new_pk = (select nextval('test_new_pk_seq'));

> but it wants to update *all* of the rows to the current nextval (I was
> hoping it would evaluate nextval on each row).

Yeah, the sub-select is taken (perhaps mistakenly) as something that
can be evaluated only once, because it doesn't depend on the outer
query.  You are overthinking the problem; this should work:

update test set new_pk = nextval('test_new_pk_seq');
        regards, tom lane


Re: How do I create unique IDs for an existing set of records

От
"Nick Fankhauser"
Дата:
> You are overthinking the problem; this should work:
> 
> update test set new_pk = nextval('test_new_pk_seq');

Thanks Tom! It did indeed work.

-Nick