Vous n'êtes pas identifié(e).
J'écris souvent des scripts sql qui écrivent des scripts sql.
Jusqu'à présent, je faisais comme ça :
select
'alter table "'
|| table_name_fk
|| '" drop constraint "'
|| column_name_fk
|| '_fk"'
|| ';'
from fks_contacts;
Existe-t-il en pg un procédé plus élégant ?
Merci
Hors ligne
Bonjour,
à part utiliser quote_ident() à la place des '"' (et gérer le nom de schéma si besoin), pas trop possible de faire mieux. Sur psql, vous pouvez utiliser \gexec (depuis la version 9.6) qui exécutera le sql généré directement.
Julien.
https://rjuju.github.io/
Hors ligne
Bonjour,
Je précise ma question : je veux transformer des contraintes PK et FK en contraintes UNIQUE.
Ces contraintes PK et FK pouvent, bien entendu, porter sur plusieurs colonnes.
Un query dans le data dictionnary me donnera toutes les infos sur les contraintes PK et FK.
Comment générer les commandes du type : alter table x add constraint unique (col1, col2, col3);
En fait, j'ai vu sur le net un procédé mais je ne me souviens plus où.
Mais il existe !
Bonne après-midi aux dalibiens !
Hors ligne
Pour créer une contrainte unique qui correspond aux champs d'une PK :
WITH s AS (
select conrelid, t.relname, unnest(c.conkey) as attnum
from pg_constraint c
join pg_class t on c.conrelid = t.oid
where conname = 't1_pkey'
)
SELECT 'ALTER TABLE ' || quote_ident(s.relname) || ' ADD UNIQUE ('
|| string_agg(quote_ident(a.attname), ', ') || ') ;'
FROM s
JOIN pg_attribute a on a.attrelid = s.conrelid AND a.attnum = s.attnum
GROUP BY s.relname;
Vous pouvez adapter ça pour les FK ou autre au cas où j'aurais mal compris votre besoin.
Julien.
https://rjuju.github.io/
Hors ligne
Merci !
Il me faudrait encore le data type de la colonne qui fait partie de la pk.
Pourriez-vous m'indiquer la solution optimale ?
Hors ligne
Regardez sur http://docs.postgresql.fr/9.6/catalog-pg-attribute.html, et donc joindre pg_type pour récupérer l'information dont vous avez besoin sur le type.
Julien.
https://rjuju.github.io/
Hors ligne
merci
ça marche encore mieux avec
|| string_agg(quote_ident(a.attname || ' (' || format_type(a.atttypid, a.atttypmod) || ') '), ', ')
Hors ligne