sql >> Database teknologi >  >> RDS >> PostgreSQL

Postgres:Opdater primær nøglesekvens for alle tabeller

her er plpgsql til at nulstille alle sekvenser (kør i pgadmin eller psql eller en hvilken som helst anden klient):

do 
$$
declare
 _r record;
 _i bigint;
 _m bigint;
begin
  for _r in (
    SELECT relname,nspname,d.refobjid::regclass, a.attname, refobjid
    FROM   pg_depend    d
    JOIN   pg_attribute a ON a.attrelid = d.refobjid AND a.attnum = d.refobjsubid
    JOIN pg_class r on r.oid = objid
    JOIN pg_namespace n on n.oid = relnamespace
    WHERE  d.refobjsubid > 0 and  relkind = 'S'
   ) loop
    execute format('select last_value from %I.%I',_r.nspname,_r.relname) into _i;
    execute format('select max(%I) from %s',_r.attname,_r.refobjid) into _m;
    if coalesce(_m,0) > _i then
      raise info '%',concat('changed: ',_r.nspname,'.',_r.relname,' from:',_i,' to:',_m); 
      execute format('alter sequence %I.%I restart with %s',_r.nspname,_r.relname,_m+1);
    end if;
  end loop;

end;
$$
;

eller brug en anden løsning foreslået på Hvordan nulstiller man postgres' primære nøglesekvens, når den falder ud af synkronisering?




  1. MySQL-forespørgsel, grupper efter og derefter sorteret efter seneste grupperet med betingelse

  2. Hurtigste måde at afgøre, om posten eksisterer

  3. Sådan fungerer UNHEX() i MariaDB

  4. Er primærnøgler passé?