Gibt es eine Abfrage, die das erledigt?
Ich habe einige Abfragen gefunden, die dies für eine Tabelle ermöglichen, konnte sie jedoch nicht ändern, damit ich Folgendes sehen kann:
tablename | column | type
Gibt es eine Abfrage, die das erledigt?
Ich habe einige Abfragen gefunden, die dies für eine Tabelle ermöglichen, konnte sie jedoch nicht ändern, damit ich Folgendes sehen kann:
tablename | column | type
Antworten:
Etwas wie das:
select tc.table_schema, tc.table_name, kc.column_name
from information_schema.table_constraints tc
join information_schema.key_column_usage kc
on kc.table_name = tc.table_name and kc.table_schema = tc.table_schema and kc.constraint_name = tc.constraint_name
where tc.constraint_type = 'PRIMARY KEY'
and kc.ordinal_position is not null
order by tc.table_schema,
tc.table_name,
kc.position_in_unique_constraint;
tc.constraint_type = 'PRIMARY KEY'
zeigt nur Primärschlüssel an. Jeder Primärschlüssel wird jedoch durch einen eindeutigen Index gesichert
position_in_unique_constraint
Gibt die Position für den AUSLÄNDISCHEN Schlüssel an. Für Primärschlüssel ist sie immer null. Die richtige Spalte ist ordinal_position
. Getestet in PG 9.4.
ordinal_position
sollten benutzt werden. Das position_in_unique_constraint
ist nicht nur im FKs-Gebrauch null.
Dies ist eine genauere Antwort:
select tc.table_schema, tc.table_name, kc.column_name
from
information_schema.table_constraints tc,
information_schema.key_column_usage kc
where
tc.constraint_type = 'PRIMARY KEY'
and kc.table_name = tc.table_name and kc.table_schema = tc.table_schema
and kc.constraint_name = tc.constraint_name
order by 1, 2;
Sie haben das and kc.constraint_name = tc.constraint_name
Teil verpasst , daher werden alle Einschränkungen aufgelistet.
and kc.position_in_unique_constraint is not null
Teil. Es wird dringend empfohlen, ANSI JOINs zu verwenden (obwohl dies für viele Geschmackssachen ist).
Bitte beachten Sie dies auch. Dadurch wird das Skript zum Ändern aller Tabellen generiert.
SELECT STRING_AGG(FORMAT('ALTER TABLE %s CLUSTER ON %s;', A.table_name, A.constraint_name), E'\n') AS SCRIPT
FROM
(
SELECT FORMAT('%s.%s', table_schema, table_name) AS table_name, constraint_name
FROM information_schema.table_constraints
WHERE UPPER(constraint_type) = 'PRIMARY KEY'
ORDER BY table_name
) AS A;
Ich denke, um Primärschlüssel und Fremdschlüssel zu erhalten, sollte dies tun. kc.position_in_unique_constraint ist nicht null. Diese Bedingung kann nur Fremdschlüssel abrufen.
select tc.table_schema, tc.table_name, kc.column_name,tc.constraint_type
from
information_schema.table_constraints tc
JOIN information_schema.key_column_usage kc
on kc.table_name = tc.table_name and kc.table_schema = tc.table_schema
and kc.constraint_name = tc.constraint_name
where
--kc.position_in_unique_constraint is not null
order by tc.table_schema,
tc.table_name,
kc.position_in_unique_constraint;