Thread: How to find primary keys by querying system tables

How to find primary keys by querying system tables

From
josteinu@sylfest.hiof.no (Jostein Ulseth)
Date:
Hi. 

I'm trying to write a select statement that does the following; 
select all tables in my database; 
for each table, select all columns, and tell me if the column is a
primary key
in the table. 

I've tried this by querying pg_class, pg_index and pg_attribute, but I
have a problem when I this is supposed to be "general", ie I do not
know the maximum number of columns in a primary key (I can't use
subscription of "indkey").

Is there a way of testing for membership in an int2vector-field? For
example:
select column, "prim.key" from ... where pg_attribute.attnum in
pg_index.indkey
?? 

Thanks! 

-Jostein


Re: How to find primary keys by querying system tables

From
Haller Christoph
Date:
> 
> Is there a way of testing for membership in an int2vector-field? For
> example:
> select column, "prim.key" from ... where pg_attribute.attnum in
> pg_index.indkey
> ?? 
> 
I think so. Refer to the array section of the documentation. 
Extract:
To search for a value in an array, you must check each value of the array. This can be done by hand (if you know the
sizeof the array): 
 

SELECT * FROM sal_emp WHERE pay_by_quarter[1] = 10000 OR                           pay_by_quarter[2] = 10000 OR
                 pay_by_quarter[3] = 10000 OR                           pay_by_quarter[4] = 10000;
 

However, this quickly becomes tedious for large arrays, and is not helpful if the size of the array is unknown.
Althoughit is not part of the primary
 
PostgreSQL distribution, in the contributions directory, there is an extension to PostgreSQL that defines new functions
andoperators for iterating
 
over array values. Using this, the above query could be: 

SELECT * FROM sal_emp WHERE pay_by_quarter[1:4] *= 10000;

To search the entire array (not just specified columns), you could use: 

SELECT * FROM sal_emp WHERE pay_by_quarter *= 10000;

In addition, you could find rows where the array had all values equal to 10 000 with: 

SELECT * FROM sal_emp WHERE pay_by_quarter **= 10000;

To install this optional module, look in the contrib/array directory of the PostgreSQL source distribution. 

Regards, Christoph