List all sequences in a Postgres db 8.1 with SQL

后端 未结 19 1739
旧时难觅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

    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.

提交回复
热议问题