2017-05-30 3 views
1

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?

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 
...