Thread: Re: [SQL] SQL-Query 2 get primary key

Re: [SQL] SQL-Query 2 get primary key

From
"D'Arcy" "J.M." Cain
Date:
Thus spake Marc Grimme
> if I create a table like this:
> CREATE TABLE test (
>    id decimal(3) primary key,
>    name varchar(32));
> 
> how can I ask postgres which is the primary key from table test?

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';
 

That lists all the primary keys in your database.  Add a "WHERE pg_class
= 'test'" clause to get the specific table.

Note that this makes the assumption that only one field can be in the
primary key (no complex primary keys) but I don't think there will
ever be more than one the way we declare it now.

-- 
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 424 2871     (DoD#0082)    (eNTP)   |  what's for dinner.



Re: [HACKERS] Re: [SQL] SQL-Query 2 get primary key

From
Hannu Krosing
Date:
"D'Arcy J.M. Cain" wrote:
> 
> Thus spake Marc Grimme
> > if I create a table like this:
> > CREATE TABLE test (
> >    id decimal(3) primary key,
> >    name varchar(32));
> >
> > how can I ask postgres which is the primary key from table test?
> 
> SELECT  pg_class.relname, pg_attribute.attname
>     FROM pg_class, pg_attribute, pg_index
>     WHERE pg_class.oid = pg_attribute.attrelid AND
>         pg_class.oid = pg_index.indrelid AND
>         pg_index.indkey[0] = pg_attribute.attnum AND
>         pg_index.indisprimary = 't';

Should it work in 6.4.0 ?

It gives an empty table for me ;(
> That lists all the primary keys in your database.  Add a "WHERE pg_class
> = 'test'" clause to get the specific table.

You probably mean "pg_class.relname = 'test'" ?

> Note that this makes the assumption that only one field can be in the
> primary key (no complex primary keys) but I don't think there will
> ever be more than one the way we declare it now.
Actually you can declare multi_field PK as 
(Bruce: this probably should be added to \h create table):

hannu=> create table test(
hannu->   id1 int,
hannu->   id2 int,
hannu->   meat text,
hannu->   primary key (id1,id2)
hannu-> );
NOTICE:  CREATE TABLE/PRIMARY KEY will create implicit index test_pkey
for table test
CREATE

-------------------------
Hannu


Re: [HACKERS] Re: [SQL] SQL-Query 2 get primary key

From
"Thomas G. Lockhart"
Date:
> > if I create a table like this:
> > CREATE TABLE test (
> >    id decimal(3) primary key,
> >    name varchar(32));
<snip>
> Note that this makes the assumption that only one field can be in the
> primary key (no complex primary keys) but I don't think there will
> ever be more than one the way we declare it now.

fyi, the following syntax is allowed:
 CREATE TABLE test (    id decimal(3),    name varchar(32),    primary key(id));

and multiple columns can be declared as primary keys.
                      - Tom