Обсуждение: how to save primary key constraints
I need to be able to query for all primary keys and save the table name and the name of the primary key field into some structure that I can iterate through later. How would I go about this? I want to hard code the number of tables and be able to iterate through some structure to get the table name and the primary key field. Regards, J.V.
On 10/11/11 2:16 PM, J.V. wrote: > I need to be able to query for all primary keys and save the table > name and the name of the primary key field into some structure that I > can iterate through later. > > How would I go about this? I want to hard code the number of tables > and be able to iterate through some structure to get the table name > and the primary key field. that info is all in pg_catalog... pg_tables is a view of all tables... if you left join that with pg_index qualified by indisprimary, you'll probably get what you need. you'll probably need to join pg_namespace to get the index name from its oid. -- john r pierce N 37, W 122 santa cruz ca mid-left coast
On 10/11/2011 05:16 PM, J.V. wrote:
> I need to be able to query for all primary keys and save the table name
> and the name of the primary key field into some structure that I can
> iterate through later.
>
> How would I go about this? I want to hard code the number of tables and
> be able to iterate through some structure to get the table name and the
> primary key field.
A query such as the following may help:
SELECT nspname, conrelid::regclass::name, conname
FROM pg_constraint c
JOIN pg_namespace ON (connamespace = pg_namespace.oid)
LEFT JOIN pg_class on (conname = relname)
WHERE (nspname != 'pg_catalog' AND nspname != 'information_schema')
AND contype = 'p'
ORDER BY nspname, 2, conname;
The first column is the schema name, the second the table name and the
third the constraint (primary key) name.
Joe
pg_catalog table does not exist. This is a solution for PostgreSQL 8.4. If you know of a way I can get all primary key fields or have a query that will work in 8.4, please help. I have done a lot of research and cannot find a simple way. J.V. On 10/11/2011 3:29 PM, John R Pierce wrote: > On 10/11/11 2:16 PM, J.V. wrote: >> I need to be able to query for all primary keys and save the table >> name and the name of the primary key field into some structure that I >> can iterate through later. >> >> How would I go about this? I want to hard code the number of tables >> and be able to iterate through some structure to get the table name >> and the primary key field. > > that info is all in pg_catalog... pg_tables is a view of all tables... > if you left join that with pg_index qualified by indisprimary, you'll > probably get what you need. you'll probably need to join pg_namespace > to get the index name from its oid. > > >
On 12/10/2011 00:24, J.V. wrote: > pg_catalog table does not exist. > It's not a table, it's PostgreSQL's version of the information_schema catalog: http://www.postgresql.org/docs/8.4/static/catalogs.html Ray. -- Raymond O'Donnell :: Galway :: Ireland rod@iol.ie
On Tue, Oct 11, 2011 at 4:33 PM, Raymond O'Donnell <rod@iol.ie> wrote: > On 12/10/2011 00:24, J.V. wrote: >> pg_catalog table does not exist. >> > > It's not a table, it's PostgreSQL's version of the information_schema > catalog: > > http://www.postgresql.org/docs/8.4/static/catalogs.html > Not quite. PostgreSQL has an information_schema too. The pg_catalog is the schema of system catalogs for PostgreSQL. The catalogs are not guaranteed to be stable interfaces the way the information_schema is. Best Wishes, Chris Travers
On 10/11/11 4:24 PM, J.V. wrote:
> pg_catalog table does not exist.
>
> This is a solution for PostgreSQL 8.4.
pg_catalog is a schema that has about 150 views and tables in it.
pg_tables is one such, as is pg_indexes (these two are both views)
you do realize, the primary key might not BE a field? it could easily
be an expression, or multiple fields.
this will list all non-catalog tables and any indexes they have.
select t.schemaname||'.'||t.tablename as name, i.indexname as
index, i.indexdef
from pg_tables t left outer join pg_indexes i
using (schemaname, tablename)
where t.schemaname not in ('pg_catalog', 'information_schema');
it doesn't identify the primary index, except via the _pkey in the name,
however.
the pg_indexes view doesn't include the "indisprimary" boolean field of
pg_index, so you'd need to expand that view, and I'm too tired to think
that clearly right now.
--
john r pierce N 37, W 122
santa cruz ca mid-left coast
Hi,
On 12 October 2011 08:16, J.V. <jvsrvcs@gmail.com> wrote:
> I need to be able to query for all primary keys and save the table name and
> the name of the primary key field into some structure that I can iterate
> through later.
psql -E is your friend here. Then use \d <table> and you get several
internal queries like this:
SELECT c.oid,
n.nspname,
c.relname
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relname ~ '^(queue)$'
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 2, 3;
oid | nspname | relname
-------+---------+---------
26732 | public | queue
SELECT conname, conrelid::pg_catalog.regclass,
pg_catalog.pg_get_constraintdef(c.oid, true) as condef
FROM pg_catalog.pg_constraint c
WHERE c.confrelid = '26732' AND c.contype = 'f' ORDER BY 1;
conname | conrelid |
condef
-----------------------------------+------------------------+------------------------------------------
T_fkey | T | FOREIGN KEY (queue) REFERENCES queue(id)
...
--
Ondrej Ivanic
(ondrej.ivanic@gmail.com)
On Tue, Oct 11, 2011 at 6:37 PM, Chris Travers <chris.travers@gmail.com> wrote: > On Tue, Oct 11, 2011 at 4:33 PM, Raymond O'Donnell <rod@iol.ie> wrote: >> On 12/10/2011 00:24, J.V. wrote: >>> pg_catalog table does not exist. >>> >> >> It's not a table, it's PostgreSQL's version of the information_schema >> catalog: >> >> http://www.postgresql.org/docs/8.4/static/catalogs.html >> > Not quite. PostgreSQL has an information_schema too. > > The pg_catalog is the schema of system catalogs for PostgreSQL. The > catalogs are not guaranteed to be stable interfaces the way the > information_schema is. This -- always look for your answer first in information_schema. As a bonus, it's also portable to many other databases and is much easier to follow. Only go to the catalogs if your performance requirements are extreme and/or you are looking for postgres specific info not found in the standard schema. merlin