How to reset sequence in postgres and fill id column with new data?

前端 未结 13 2159
星月不相逢
星月不相逢 2020-11-27 10:47

I have a table with over million rows. I need to reset sequence and reassign id column with new values (1, 2, 3, 4... etc...). Is any easy way to do that?

13条回答
  •  野趣味
    野趣味 (楼主)
    2020-11-27 11:18

    Even the auto-increment column is not PK ( in this example it is called seq - aka sequence ) you could achieve that with a trigger :

    DROP TABLE IF EXISTS devops_guide CASCADE;

    SELECT 'create the "devops_guide" table'
    ;
       CREATE TABLE devops_guide (
          guid           UUID NOT NULL DEFAULT gen_random_uuid()
        , level          integer NULL
        , seq            integer NOT NULL DEFAULT 1
        , name           varchar (200) NOT NULL DEFAULT 'name ...'
        , description    text NULL
        , CONSTRAINT pk_devops_guide_guid PRIMARY KEY (guid)
        ) WITH (
          OIDS=FALSE
        );
    
    -- START trg_devops_guide_set_all_seq
    CREATE OR REPLACE FUNCTION fnc_devops_guide_set_all_seq()
        RETURNS TRIGGER
        AS $$
           BEGIN
             UPDATE devops_guide SET seq=col_serial FROM
             (SELECT guid, row_number() OVER ( ORDER BY seq) AS col_serial FROM devops_guide ORDER BY seq) AS tmp_devops_guide
             WHERE devops_guide.guid=tmp_devops_guide.guid;
    
             RETURN NEW;
           END;
        $$ LANGUAGE plpgsql;
    
     CREATE TRIGGER trg_devops_guide_set_all_seq
      AFTER UPDATE OR DELETE ON devops_guide
      FOR EACH ROW
      WHEN (pg_trigger_depth() < 1)
      EXECUTE PROCEDURE fnc_devops_guide_set_all_seq();
    

提交回复
热议问题