Re: getting a sequence to update properly

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1


> I would  normally just set minimum value to something greater than what
> already in the table,

That's the way to go.

> but the manually keyed values are all over the place, and I guess I'd
> really like to remove the gaps in the current values.

You'll have to do that yourself, perhaps with a plpgsql function or
an perl script. Here's a quick little function that should do the
job: give it a tablename and a column. The column must contain
unique, positive ids. After running, just slap a default nextval
on the column with a sequence starting at one above the number returned
and you're done.

CREATE OR REPLACE FUNCTION removeholes(text,text) RETURNS INT LANGUAGE plpgsql AS
$$
DECLARE
  T ALIAS FOR $1;
  C ALIAS FOR $2;
  myst TEXT;
  mycount INT := 0;
  myrec RECORD;
BEGIN
  myst := 'UPDATE '||T||' SET '||C||' = -'||C;
  EXECUTE myst;

  myst := 'SELECT '||C||' FROM '||T||' ORDER BY '||C||' DESC ';
  FOR myrec IN EXECUTE myst LOOP
    mycount := mycount + 1;
    myst := 'UPDATE '||T||' SET '||C||' = '||mycount||' WHERE '||C||' = '||myrec.id;
    EXECUTE myst;
  END LOOP;
  RETURN mycount;
END;
$$;

- --
Greg Sabino Mullane greg@xxxxxxxxxxxx
PGP Key: 0x14964AC8 200506180923
http://biglumber.com/x/web?pk=2529DF6AB8F79407E94445B4BC9B906714964AC8
-----BEGIN PGP SIGNATURE-----

iD8DBQFCtCfbvJuQZxSWSsgRAuBJAJ4q9STr6u6fhssye0l8FitirLZwzQCgwR8g
G2+MqdQquDJz8O3G6zBsVS4=
=MfLV
-----END PGP SIGNATURE-----




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux