Foreign Keys einer Tabelle herausfinden

Foreign Keys einer Tabelle herausfinden

am 07.09.2009 19:21:11 von Philipp Lawitschka

Hallo Liste,

meine Anwendung muß zur Laufzeit ein Datenbankschema analysieren (ei=
ne=20
Art DBIx::Class). Ich hab im Prinzip alles herausgefunden, nur komm ich=20
irgendwie nicht an die Fremdschlüssel einer Tabelle ran. Hiermit bek=
omm=20
ich viel zu viele Datensätze und weiß nicht mehr, nach was ich =
noch=20
filtern soll:

SELECT c.conname, c.contype, c.conrelid, c.conkey, c.confkey,
a.attname, a.attnum, a.atttypid, x.relname AS MyTable, z.relname AS=20
ForeignTable, t.typname
FROM pg_constraint c
INNER JOIN pg_class x ON c.conrelid =3D x.oid
INNER JOIN pg_class z ON c.confrelid =3D z.oid
INNER JOIN pg_attribute a ON c.conkey[1] =3D a.attnum
INNER JOIN pg_type t ON a.atttypid =3D t.oid
WHERE c.contype =3D 'f'::char AND t.typname=3D'int4';

Ich bin kein Profi in den Systemkatalogen. Weiß hier jemand, wie man=
das=20
am besten angehen könnte?

Viele Grüße
Philipp Lawitschka

--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.o=
rg)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein

Re: Foreign Keys einer Tabelle herausfinden

am 07.09.2009 23:22:19 von Philipp Lawitschka

Hi nochmal,

habs schon herausgefunden...wen es interessiert:

SELECT c.conname, c.conkey[1] AS MyColumnID, c.confkey[1] AS =20
ForeignColumnID, tab1.relname AS MyTable,
tab2.relname AS ForeignTable, a1.attname AS MyColumn,
a2.attname AS ForeignColumn
FROM pg_constraint c
INNER JOIN pg_class tab1 ON c.conrelid =3D tab1.oid
INNER JOIN pg_class tab2 ON c.confrelid =3D tab2.oid
INNER JOIN pg_attribute a1 ON c.conkey[1] =3D a1.attnum
INNER JOIN pg_attribute a2 ON c.confkey[1] =3D a2.attnum
WHERE c.contype =3D 'f' AND a1.attrelid =3D tab1.oid AND a2.attrelid =3D =
tab2.oid

Grüße


Philipp Lawitschka schrieb:
> Hallo Liste,
>=20
> meine Anwendung muß zur Laufzeit ein Datenbankschema analysieren (=
eine=20
> Art DBIx::Class). Ich hab im Prinzip alles herausgefunden, nur komm ich=
=20
> irgendwie nicht an die Fremdschlüssel einer Tabelle ran. Hiermit b=
ekomm=20
> ich viel zu viele Datensätze und weiß nicht mehr, nach was ic=
h noch=20
> filtern soll:
>=20
> SELECT c.conname, c.contype, c.conrelid, c.conkey, c.confkey,
> a.attname, a.attnum, a.atttypid, x.relname AS MyTable, z.relname =
=20
> AS ForeignTable, t.typname
> FROM pg_constraint c
> INNER JOIN pg_class x ON c.conrelid =3D x.oid
> INNER JOIN pg_class z ON c.confrelid =3D z.oid
> INNER JOIN pg_attribute a ON c.conkey[1] =3D a.attnum
> INNER JOIN pg_type t ON a.atttypid =3D t.oid
> WHERE c.contype =3D 'f'::char AND t.typname=3D'int4';
>=20
> Ich bin kein Profi in den Systemkatalogen. Weiß hier jemand, wie m=
an das=20
> am besten angehen könnte?
>=20
> Viele Grüße
> Philipp Lawitschka
>=20


--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.o=
rg)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein

Re: Foreign Keys einer Tabelle herausfinden

am 07.09.2009 23:36:48 von adsmail

Hallo,

On Mon, 07 Sep 2009 23:22:19 +0200 Philipp Lawitschka wrote:

> habs schon herausgefunden...wen es interessiert:
>=20
> SELECT c.conname, c.conkey[1] AS MyColumnID, c.confkey[1] AS =
=20
> ForeignColumnID, tab1.relname AS MyTable,
> tab2.relname AS ForeignTable, a1.attname AS MyColumn,
> a2.attname AS ForeignColumn
> FROM pg_constraint c
> INNER JOIN pg_class tab1 ON c.conrelid =3D tab1.oid
> INNER JOIN pg_class tab2 ON c.confrelid =3D tab2.oid
> INNER JOIN pg_attribute a1 ON c.conkey[1] =3D a1.attnum
> INNER JOIN pg_attribute a2 ON c.confkey[1] =3D a2.attnum
> WHERE c.contype =3D 'f' AND a1.attrelid =3D tab1.oid AND a2.attrelid =3D =
tab2.oid

Wäre es nicht praktischer, das portabel über verschiedene Version=
en
hinweg zu gestalten? Der View:

information_schema.referential_constraints

enthält die Informationen, die du suchst. Die Systemtabellen
können sich von Version zu Version ändern, das information_schema
bleibt gleich.


Bis dann

--=20
Andreas 'ads' Scherbaum
German PostgreSQL User Group
European PostgreSQL User Group - Board of Directors
Volunteer Regional Contact, Germany - PostgreSQL Project

PGDay.eu 2009 in Paris, Nov. 6/7, http://www.pgday.eu/

--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein