Re: altering a table to set serial function - Mailing list pgsql-general

From Prabu Subroto
Subject Re: altering a table to set serial function
Date
Msg-id 20040728120933.91060.qmail@web41801.mail.yahoo.com
Whole thread Raw
In response to Re: altering a table to set serial function  ("Scott Marlowe" <smarlowe@qwest.net>)
Responses Re: altering a table to set serial function  (Martijn van Oosterhout <kleptog@svana.org>)
Re: altering a table to set serial function  (Doug McNaught <doug@mcnaught.org>)
Re: altering a starting value of "serial" macro  (Prabu Subroto <prabu_subroto@yahoo.com>)
Re: altering a table to set serial function  ("Scott Marlowe" <smarlowe@qwest.net>)
Re: altering a table to set serial function  ("Scott Marlowe" <smarlowe@qwest.net>)
List pgsql-general
Dear Scott...

My God.... so I can not use "alter table" to define a
column with int data type?

Here is the detail condition:
I have created a table "sales". And I forgot to define
auto_increment for primary key "salesid" (int4). the
table has already contented the data.

I built an application with Qt. I thougt that I can
define a column with auto_increment function afterall.

I want my application program only has to insert
"firstname", "lastname" etc. And the database server
(postgres) will put the increment value into the
salesid automatically.

If I read your suggestion, that means...I have drop
the column "salesid" and re-create the column
"salesid". and it means, I will the data in the
current "salesid" column.

Do you have further suggestion?

Thank you very much in advance.
--- Scott Marlowe <smarlowe@qwest.net> wrote:
> On Tue, 2004-07-27 at 11:16, Prabu Subroto wrote:
> > Dear my friends...
> >
> > I am using postgres 7.4 and SuSE 9.1.
> >
> > I want to use auto_increment as on MySQL. I look
> up
> > the documentation on www.postgres.com and I found
> > "serial" .
> >
> > But I don't know how to create auto_increment.
> > here is my try:
> > "
> > kv=# alter table sales alter column salesid int4
> > serial;
> > ERROR:  syntax error at or near "int4" at
> character 40
> > "
>
> Serial is a "macro" that makes postgresql do a
> couple of things all at
> once.  Let's take a look at the important parts of
> that by running a
> create table with a serial keyword, and then
> examining the table, shall
> we?
>
> est=> create table test (id serial primary key, info
> text);
> NOTICE:  CREATE TABLE will create implicit sequence
> "test_id_seq" for
> "serial" column "test.id"
> NOTICE:  CREATE TABLE / PRIMARY KEY will create
> implicit index
> "test_pkey" for table "test"
> CREATE TABLE
> test=> \d test
>                            Table "public.test"
>  Column |  Type   |                      Modifiers
>
--------+---------+------------------------------------------------------
>  id     | integer | not null default
> nextval('public.test_id_seq'::text)
>  info   | text    |
> Indexes:
>     "test_pkey" primary key, btree (id)
>
> test=> \ds
>              List of relations
>  Schema |    Name     |   Type   |  Owner
> --------+-------------+----------+----------
>  public | test_id_seq | sequence | smarlowe
> (1 row)
>
> Now, as well as creating the table and sequence,
> postgresql has, in the
> background, created a dependency for the sequence on
> the table.  This
> means that if we drop the table, the sequence
> created by the create
> table statement will disappear as well.
>
> Now, you were close, first you need to add a column
> of the proper type,
> create a sequence and tell the table to use that
> sequence as the
> default.  Let's assume I'd made the table test like
> this:
>
> test=> create table test (info text);
> CREATE TABLE
> test=>
>
> And now I want to add an auto incrementing column.
> We can't just add a
> serial because postgresql doesn't support setting
> defaults in an alter
> table, so we just add an int4, make a sequence, and
> assign the default:
>
> test=> alter table test add id int4 unique;
> NOTICE:  ALTER TABLE / ADD UNIQUE will create
> implicit index
> "test_id_key" for table "test"
> ALTER TABLE
> test=> create sequence test_id_seq;
> CREATE SEQUENCE
> test=> alter table test alter column id set default
> nextval('test_id_seq'::text);
> ALTER TABLE
>
>
> Now, if you have a bunch of already existing rows,
> like this:
>
> test=> select * from test;
>  info | id
> ------+----
>  abc  |
>  def  |
> (2 rows)
>
> then you need to populate those rows id field to put
> in a sequence, and
> that's pretty easy, actually:
>
> est=> update test set id=DEFAULT;
> UPDATE 2
> test=> select * from test;
>  info | id
> ------+----
>  abc  |  1
>  def  |  2
> (2 rows)
>
> test=>
>
> And there you go!
>
>
> ---------------------------(end of
> broadcast)---------------------------
> TIP 5: Have you checked our extensive FAQ?
>
>
> http://www.postgresql.org/docs/faqs/FAQ.html
>




__________________________________
Do you Yahoo!?
Y! Messenger - Communicate in real time. Download now.
http://messenger.yahoo.com

pgsql-general by date:

Previous
From: Janning Vygen
Date:
Subject: EXPLAIN on DELETE statements
Next
From: R.Welz
Date:
Subject: Re: Discussion wanted: 'Trigger on Delete' cascade.