Thread: Re: [SQL] SQL-Query 2 get primary key
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.
"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
> > 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