187

私はdbをpostgresからmysqlに変換しています。

トリック自体を実行するツールが見つからないため、すべてのpostgresシーケンスを自動インクリメント値を使用してmysqlの自動インクリメントIDに変換します。

では、 Postgres DB(8.1バージョン)内のすべてのシーケンスを、それが使用されているテーブル、SQLクエリを使用した次の値などに関する情報とともに一覧表示するにはどうすればよいですか?

information_schema.sequences8.4リリースではビューを使用できないことに注意してください。

4

20 に答える 20

322

次のクエリは、すべてのシーケンスの名前を示します。

SELECT c.relname FROM pg_class c WHERE c.relkind = 'S';

通常、シーケンスの名前は${table}_id_seq. 単純な正規表現パターン マッチングにより、テーブル名が得られます。

シーケンスの最後の値を取得するには、次のクエリを使用します。

SELECT last_value FROM test_id_seq;
于 2009-10-23T06:28:06.773 に答える
107

PostgreSQL 8.4 以降、データベースで使用されているシーケンスに関するすべての情報を次の方法で取得できることに注意してください。

SELECT * FROM information_schema.sequences;

私はより高いバージョンの PostgreSQL (9.1) を使用しており、高低で同じ回答を検索していたので、後世と将来の検索者のためにこの回答を追加しました。

于 2014-11-06T11:31:01.523 に答える
69

フラグ (「およびその他のバックスラッシュ コマンドによって生成された実際のクエリをエコーする」) を指定して起動psqlし、コマンドを入力してすべてのシーケンスを一覧表示します。次のように表示されます。-E\d\ds

# \ds
********* QUERY **********
SELECT n.nspname as "Schema",
  c.relname as "Name",
  CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'm' THEN 'materialized view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' WHEN 'f' THEN 'foreign table' WHEN 'p' THEN 'partitioned table' WHEN 'I' THEN 'partitioned index' END as "Type",
  pg_catalog.pg_get_userbyid(c.relowner) as "Owner"
FROM pg_catalog.pg_class c
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('S','')
      AND n.nspname <> 'pg_catalog'
      AND n.nspname <> 'information_schema'
      AND n.nspname !~ '^pg_toast'
  AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1,2;
**************************

                     List of relations
 Schema |              Name              |   Type   | Owner 
--------+--------------------------------+----------+-------
 public | assignments_id_seq             | sequence | root
 public | framework_users_id_seq         | sequence | root
 public | lending_items_id_seq           | sequence | root
 public | proxy_borrower_requests_id_seq | sequence | root
 public | roles_id_seq                   | sequence | root
 public | stack_requests_id_seq          | sequence | root
(6 rows)

特定のシーケンスを調べるには、次を実行できます\d <sequence name>

# \d lending_items_id_seq
********* QUERY **********

(...about four queries...)

**************************

                    Sequence "public.lending_items_id_seq"
  Type  | Start | Minimum |       Maximum       | Increment | Cycles? | Cache 
--------+-------+---------+---------------------+-----------+---------+-------
 bigint |     1 |       1 | 9223372036854775807 |         1 | no      |     1
Owned by: public.lending_items.id
于 2009-09-29T16:04:23.930 に答える
30

少しの痛みの後、私はそれを手に入れました。

これを達成する最善の方法は、すべてのテーブルをリストすることです

select * from pg_tables where schemaname = '<schema_name>'

次に、各テーブルについて、属性を持つすべての列を一覧表示します

select * from information_schema.columns where table_name = '<table_name>'

次に、列ごとに、シーケンスがあるかどうかをテストします

select pg_get_serial_sequence('<table_name>', '<column_name>')

次に、このシーケンスに関する情報を取得します

select * from <sequence_name>
于 2009-10-01T08:08:15.190 に答える
17

シーケンス情報: 最大値

SELECT * FROM information_schema.sequences;

シーケンス情報: 最後の値

SELECT * FROM <sequence_name>

于 2016-10-20T12:18:08.670 に答える
11

自動生成されたシーケンス (SERIAL 列用に作成されたシーケンスなど) と親テーブルとの関係は、シーケンス所有者属性によってモデル化されます。

この関係は、ALTER SEQUENCE コマンドの OWNED BY 句を使用して変更できます。

例: ALTER SEQUENCE foo_id OWNED by foo_schema.foo_table

テーブル foo_table にリンクされるように設定します

または ALTER SEQUENCE foo_id OWNED by NONE

シーケンスとテーブルの間の接続を切断する

この関係に関する情報は、pg_depend カタログ テーブルに保存されます。

結合関係は、 pg_depend.objid -> pg_class.oid WHERE relkind = 'S' - シーケンスを結合レコードにリンクし、次に pg_depend.refobjid -> pg_class.oid WHERE relkind = 'r' の間のリンクです。レコードを所有関係に結合します ( table )

このクエリは、データベース内のすべてのシーケンス -> テーブルの依存関係を返します。where 句は、自動生成されたリレーションシップのみを含めるようにフィルター処理し、SERIAL 型の列によって作成されたシーケンスのみを表示するように制限します。

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, 
       '->' as depends, 
       t.fqname AS table 
FROM 
     pg_depend d JOIN sequences s ON s.oid = d.objid  
                 JOIN tables t ON t.oid = d.refobjid  
WHERE 
     d.deptype = 'a' ;
于 2012-07-24T11:35:20.023 に答える
4

このステートメントは、各シーケンスに関連付けられているテーブルと列を一覧表示します。

コード:

    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'

詳細はこちら回答へのリンク

于 2016-08-30T16:44:59.860 に答える
1

部分的にテストされていますが、ほぼ完全に見えます。

select *
  from (select n.nspname,c.relname,
               (select substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128)
                  from pg_catalog.pg_attrdef d
                 where d.adrelid=a.attrelid
                   and d.adnum=a.attnum
                   and a.atthasdef) as def
          from pg_class c, pg_attribute a, pg_namespace n
         where c.relkind='r'
           and c.oid=a.attrelid
           and n.oid=c.relnamespace
           and a.atthasdef
           and a.atttypid=20) x
 where x.def ~ '^nextval'
 order by nspname,relname;

クレジットが必要なクレジット...それは、シーケンスを持つ既知のテーブルの \d からログに記録された SQL から部分的にリバース エンジニアリングされたものです。それもきれいになると確信していますが、パフォーマンスは問題ではありませんでした.

于 2009-10-02T19:16:53.550 に答える
1

一種のハックですが、これを試してください:

select 'select ''' || relname  || ''' as sequence, last_value from '  || relname || '  union'
FROM pg_catalog.pg_class c
WHERE c.relkind IN ('S','');

最後の UNION を削除し、結果を実行します

于 2013-01-04T00:25:09.957 に答える
0

Here is an example how to use psql to get a list of all sequences with their last_value:

psql -U <username> -d <database> -t -c "SELECT 'SELECT ''' || c.relname || ''' as sequence_name, last_value FROM ' || c.relname || ';' FROM pg_class c WHERE (c.relkind = 'S')" | psql -U <username> -d <database> -t

于 2020-05-21T16:56:11.493 に答える
0

ご協力いただきありがとうございます。

これは、データベースの各シーケンスを更新する pl/pgsql 関数です。

---------------------------------------------------------------------------------------------------------
--- 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();
于 2016-09-07T17:21:29.947 に答える