J'ai une poignée de tables avec PK qui sont prises à partir de séquences dédiées. Malheureusement, je suppose que l'une de ces séquences est utilisée deux fois (pour générer un ID) pour deux tables différentes. Est-il possible d'écrire une requête qui retournera tous les champs (le nom du champ est toujours ID
) et les séquences utilisées génèreront une valeur par défaut pour ces champs?Comment faire correspondre le champ ID avec sa séquence?
1
A
Répondre
2
La requête énumère les noms de tables et séquences associées à la colonne id
des tables:
select
nspname as schema,
relname as table,
trim(substring(pg_get_expr(adbin, adrelid), e'\'.*\''), '''') as sequence
from pg_attribute a
join pg_attrdef d on adrelid = attrelid and adnum = attnum
join pg_class c on c.oid = attrelid
join pg_namespace n on n.oid = relnamespace
where attname = 'id' and atthasdef
and left(pg_get_expr(adbin, adrelid), 7) = 'nextval';
schema | table | sequence
--------+--------------+---------------------
public | test_table | test_table_id_seq
public | log | log_id_seq
public | master | master_id_seq
public | details | details_id_seq
...
Vous pouvez ignorer la condition attname = 'id'
. La requête trouve des colonnes ayant une fonction nextval()
comme expression par défaut, par exemple:
select
nspname as schema,
relname as table,
attname as column,
trim(substring(pg_get_expr(adbin, adrelid), e'\'.*\''), '''') as sequence
from pg_attribute a
join pg_attrdef d on adrelid = attrelid and adnum = attnum
join pg_class c on c.oid = attrelid
join pg_namespace n on n.oid = relnamespace
where atthasdef
and left(pg_get_expr(adbin, adrelid), 7) = 'nextval';
schema | table | column | sequence
--------+--------------+-----------+-----------------------
public | test_table | id | test_table_id_seq
public | log | id | log_id_seq
public | wallets | wallet_id | wallets_wallet_id_seq
public | master | id | master_id_seq
public | details | id | details_id_seq
...