Re: Can a function determine whether a primary key constraint exists on a table?

Started by Albe Laurenzover 19 years ago2 messagesgeneral
Jump to latest
#1Albe Laurenz
all@adv.magwien.gv.at

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

#2Noname
ptjm@interlog.com
In reply to: Albe Laurenz (#1)

In article <52EF20B2E3209443BC37736D00C3C1380AD5FEFF@EXADV1.host.magwien.gv.at>,
Albe Laurenz <all@adv.magwien.gv.at> wrote:

% > 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, perhaps simpler,

select * from information_schema.table_constraints
where constraint_type = 'PRIMARY KEY';

--

Patrick TJ McPhee
North York Canada
ptjm@interlog.com