Re: Can a function determine whether a primary key constraint exists on a table? - Mailing list pgsql-general

From Albe Laurenz
Subject Re: Can a function determine whether a primary key constraint exists on a table?
Date
Msg-id 52EF20B2E3209443BC37736D00C3C1380AD5FEFF@EXADV1.host.magwien.gv.at
Whole thread Raw
In response to Can a function determine whether a primary key constraint exists on a table?  ("Rob Richardson" <Rob.Richardson@rad-con.com>)
List pgsql-general
>                                           The PostGres
> database has 90 tables (including the one I just added).
[...]
>      I would like to write a function that would add a
> column to a table, populate it with the number 1 to n (where
> n is the number of rows in the table), make that column the
> table's primary key, create a sequence beginning with n+1,
> and give the new column a default of nextval('new_sequence').
>  All of this is, if I understand things correctly,
> straightforward.

Consider adding a column of the pseudotype 'serial'.
This is in fact an integer with a sequence behind it.
It will save some effort.

I would NOT do this with a function, but rather consider each
individual case and make the changes manually.

>                  But what if the table already has a primary
> key contraint?  A few of them do, but I believe the designer
> used them to enforce uniqueness, not to describe
> relationships.  So I would like my function to check of the
> target table has a primary key constraint.  If it does, that
> constraint should be dropped and a new one added to ensure
> that the column values are unique.

If the primary key columns are not likely to change,
you should leave them as they are. There is no need to create
an artificial primary key if there is a good natural primary key.

>                                     How can I check for the
> presence of constraints inside a function?

select t.oid as tableid, t.relname as tablename,
      c.oid as constraintid, conname as constraintname
from pg_constraint c join pg_class t on (c.conrelid = t.oid);

Or similar.

> Also, can someone point me to a web resource that describes
> the syntax of PostGres functions?  The database I have has
> several functions that I can use as examples, but I don't
> have a reference book.

http://www.postgresql.org/docs/8.1/static/server-programming.html

Yours,
Laurenz Albe

pgsql-general by date:

Previous
From: "Rob Richardson"
Date:
Subject: Can a function determine whether a primary key constraint exists on a table?
Next
From: Alban Hertroys
Date:
Subject: Re: Can a function determine whether a primary key constraint