List all sequences in a Postgres db 8.1 with SQL

后端 未结 19 1711
旧时难觅i
旧时难觅i 2020-12-12 11:30

I\'m converting a db from postgres to mysql.

Since i cannot find a tool that does the trick itself, i\'m going to convert all postgres sequences to autoincrement id

相关标签:
19条回答
  • 2020-12-12 12:02

    This statement lists the table and column that is associated with each sequence:

    Code:

        SELECT t.relname as related_table, 
               a.attname as related_column,
               s.relname as sequence_name
        FROM pg_class s 
          JOIN pg_depend d ON d.objid = s.oid 
          JOIN pg_class t ON d.objid = s.oid AND d.refobjid = t.oid 
          JOIN pg_attribute a ON (d.refobjid, d.refobjsubid) = (a.attrelid, a.attnum)
          JOIN pg_namespace n ON n.oid = s.relnamespace 
        WHERE s.relkind     = 'S' 
    
      AND n.nspname     = 'public'
    

    more see here link to answer

    0 讨论(0)
  • 2020-12-12 12:02

    I know the question was about postgresql version 8 but I wrote this simple way here for people who want to get sequences in version 10 and upper

    you can use the bellow query

    select * from pg_sequences
    

    view-pg-sequences

    0 讨论(0)
  • 2020-12-12 12:02

    Get sequences by each column of each table via parsing of DEFAULT clause. This method provides info about to which column sequences are linked and does not use dependencies which may not exist for some sequences. Even pg_get_serial_sequence(sch.nspname||'.'||tbl.relname, col.attname) function found not all sequences for me!

    Solution:

    SELECT
        seq_sch.nspname  AS sequence_schema
      , seq.relname      AS sequence_name
      , seq_use."schema" AS used_in_schema
      , seq_use."table"  AS used_in_table
      , seq_use."column" AS used_in_column
    FROM pg_class seq
      INNER JOIN pg_namespace seq_sch ON seq_sch.oid = seq.relnamespace
      LEFT JOIN (
                  SELECT
                      sch.nspname AS "schema"
                    , tbl.relname AS "table"
                    , col.attname AS "column"
                    , regexp_split_to_array(
                          TRIM(LEADING 'nextval(''' FROM
                               TRIM(TRAILING '''::regclass)' FROM
                                    pg_get_expr(def.adbin, tbl.oid, TRUE)
                               )
                          )
                          , '\.'
                      )           AS column_sequence
                  FROM pg_class tbl --the table
                    INNER JOIN pg_namespace sch ON sch.oid = tbl.relnamespace
                    --schema
                    INNER JOIN pg_attribute col ON col.attrelid = tbl.oid
                    --columns
                    INNER JOIN pg_attrdef def ON (def.adrelid = tbl.oid AND def.adnum = col.attnum) --default values for columns
                  WHERE tbl.relkind = 'r' --regular relations (tables) only
                        AND col.attnum > 0 --regular columns only
                        AND def.adsrc LIKE 'nextval(%)' --sequences only
                ) seq_use ON (seq_use.column_sequence [1] = seq_sch.nspname AND seq_use.column_sequence [2] = seq.relname)
    WHERE seq.relkind = 'S' --sequences only
    ORDER BY sequence_schema, sequence_name;
    

    Note that 1 sequence can be used in multiple tables, so it can be listed in multiple rows here.

    0 讨论(0)
  • 2020-12-12 12:02

    Thanks for your help.

    Here is the pl/pgsql function which update each sequence of a database.

    ---------------------------------------------------------------------------------------------------------
    --- Nom : reset_sequence
    --- Description : Générique - met à jour les séquences au max de l'identifiant
    ---------------------------------------------------------------------------------------------------------
    
    CREATE OR REPLACE FUNCTION reset_sequence() RETURNS void AS 
    $BODY$
    DECLARE _sql VARCHAR := '';
    DECLARE result threecol%rowtype; 
    BEGIN
    FOR result IN 
    WITH fq_objects AS (SELECT c.oid,n.nspname || '.' ||c.relname AS fqname ,c.relkind, c.relname AS relation FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace ),
        sequences AS (SELECT oid,fqname FROM fq_objects WHERE relkind = 'S'),
        tables    AS (SELECT oid, fqname FROM fq_objects WHERE relkind = 'r' )
    SELECT
           s.fqname AS sequence,
           t.fqname AS table,
           a.attname AS column
    FROM
         pg_depend d JOIN sequences s ON s.oid = d.objid
                     JOIN tables t ON t.oid = d.refobjid
                     JOIN pg_attribute a ON a.attrelid = d.refobjid and a.attnum = d.refobjsubid
    WHERE
         d.deptype = 'a' 
    LOOP
         EXECUTE 'SELECT setval('''||result.col1||''', COALESCE((SELECT MAX('||result.col3||')+1 FROM '||result.col2||'), 1), false);';
    END LOOP;
    END;$BODY$ LANGUAGE plpgsql;
    
    SELECT * FROM reset_sequence();
    
    0 讨论(0)
  • 2020-12-12 12:04
    select sequence_name, (xpath('/row/last_value/text()', xml_count))[1]::text::int as last_value
    from (
        select sequence_schema,
                sequence_name,         
                query_to_xml(format('select last_value from %I.%I', sequence_schema, sequence_name), false, true, '') as xml_count
        from information_schema.sequences
        where sequence_schema = 'public'
    ) new_table order by last_value desc;
    
    0 讨论(0)
  • 2020-12-12 12:07

    Here is another one which has the schema name beside the sequence name

    select nspname,relname from pg_class c join pg_namespace n on c.relnamespace=n.oid where relkind = 'S' order by nspname
    
    0 讨论(0)
提交回复
热议问题