Re: Finding primary keys - Mailing list pgsql-sql

From Tom Lane
Subject Re: Finding primary keys
Date
Msg-id 26622.955409712@sss.pgh.pa.us
Whole thread Raw
In response to Finding primary keys  ("Matlack, Brad" <matlackb@ogden.disa.mil>)
List pgsql-sql
"Matlack, Brad" <matlackb@ogden.disa.mil> writes:
> I'm trying to determine which fields in a table are primary keys, using a
> select statement.  

This was just discussed in connection with the ODBC driver.  The best
solution I saw was

select ta.attname, ia.attnum
from pg_attribute ta, pg_attribute ia, pg_class c, pg_index i
where c.relname = 'foo_pkey'   AND c.oid = i.indexrelid   AND ia.attrelid = i.indexrelid   AND ta.attrelid = i.indrelid
 AND ta.attnum = i.indkey[ia.attnum-1]
 
ORDER BY ia.attnum;

where 'foo' is the table you are interested in.

You could also do just

select attname, attnum from pg_attribute a, pg_class c
where c.relname = 'foo_pkey'   AND attrelid = c.oid   AND attnum > 0
ORDER BY attnum;

but this'll not track renaming of columns via ALTER TABLE RENAME COLUMN,
since what it's showing you is actually the names of the columns in the
index relation, and ALTER doesn't bother to change those.
        regards, tom lane


pgsql-sql by date:

Previous
From: Tom Lane
Date:
Subject: Re: Speedy query help..
Next
From: Andrew Perrin - Demography
Date:
Subject: Using overlaps()