Y a-t-il une requête qui fera cela?
J'ai trouvé quelques requêtes qui peuvent le faire pour une table, mais je n'ai pas pu le modifier pour que je puisse voir:
tablename | column | type
Y a-t-il une requête qui fera cela?
J'ai trouvé quelques requêtes qui peuvent le faire pour une table, mais je n'ai pas pu le modifier pour que je puisse voir:
tablename | column | type
Réponses:
Quelque chose comme ça:
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'
n'affichera que les clés primaires. Cependant, chaque clé primaire est soutenue par un index unique
position_in_unique_constraint
indique la position de la clé FOREIGN, elle est toujours nulle pour les clés primaires. La colonne correcte est ordinal_position
. Testé dans PG 9.4.
ordinal_position
devraient être utilisés. Le position_in_unique_constraint
n'est pas nul uniquement dans l'utilisation des FK.
C'est une réponse plus précise:
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;
Vous avez manqué la and kc.constraint_name = tc.constraint_name
partie, elle répertorie donc toutes les contraintes.
and kc.position_in_unique_constraint is not null
partie manquante . Et vous êtes fortement encouragé à utiliser les jointures ANSI (alors que beaucoup considèrent que c'est une question de goût).
Veuillez également considérer cela. Cela générera le script pour modifier toutes les tables.
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;
Je pense que pour obtenir la clé primaire et la clé étrangère devrait faire comme ça. kc.position_in_unique_constraint n'est pas nul, cette condition ne peut obtenir que des clés étrangères.
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;