Re: [SQL] how can tell if a column is a primary key? - Mailing list pgsql-sql

From D'Arcy" "J.M." Cain
Subject Re: [SQL] how can tell if a column is a primary key?
Date
Msg-id m11nLKh-0000bFC@druid.net
Whole thread Raw
In response to how can tell if a column is a primary key?  (Mark Stosberg <mark@summersault.com>)
Responses Re: [SQL] how can tell if a column is a primary key?  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-sql
Thus spake Mark Stosberg
>  I'm writing some perl code to access arbitrary Postgres tables. As part
> of this, I would like to be to tell if a given column is a primary key.
> Given a table and a column name, is there is a select statement I can
> run on the systems tables to tell me whether or not it's a primary key? Thanks.

This is getting to be a FAQ.

SELECT pg_class.relname, pg_attribute.attname   FROM pg_class, pg_attribute, pg_index   WHERE pg_class.oid =
pg_attribute.attrelidAND       pg_class.oid = pg_index.indrelid AND       pg_index.indkey[0] = pg_attribute.attnum AND
    pg_index.indisprimary = 't';
 

will give you a list of tables and the primary key.  Just add a further
test to the WHERE clause to get one table.  Also, check all of the indkey
array for complex primary keys.  

Here's another FAQ but one that no one has ever answered that I know of.
How do I generalize the above query so that it returns information on
all the elements of complex keys?  I don't care if I have to put them
together myself, just so that I get the info.  The following is two
queries I tried but neither on is correct.  Anyone see what I am trying
to accomplish here and know how to do it properly?

-- I thought that leaving off the array index might work but it didn't
SELECT pg_class.relname, pg_attribute.attname           FROM pg_class, pg_attribute, pg_index   WHERE pg_class.oid =
pg_attribute.attrelidAND          pg_class.oid = pg_index.indrelid AND       pg_index.indkey = pg_attribute.attnum AND
       pg_index.indisprimary = 't';                 
 

-- Then I thought that an array was like a set but nope.
SELECT pg_class.relname, pg_attribute.attname   FROM pg_class, pg_attribute, pg_index   WHERE pg_class.oid =
pg_attribute.attrelidAND       pg_class.oid = pg_index.indrelid AND        pg_attribute.attnum IN pg_index.indkey AND
    pg_index.indisprimary = 't';
 

Any ideas?

-- 
D'Arcy J.M. Cain <darcy@{druid|vex}.net>   |  Democracy is three wolves
http://www.druid.net/darcy/                |  and a sheep voting on
+1 416 425 1212     (DoD#0082)    (eNTP)   |  what's for dinner.


pgsql-sql by date:

Previous
From: oskar stuffer
Date:
Subject: large objects over network connection
Next
From: Thomas Lockhart
Date:
Subject: Re: [SQL] nulls and datetime