使用SQL列出Postgres db 8.1中的所有序列

ape*_*ari 130 sql database migration postgresql sequences

我正在将db从postgres转换为mysql.

由于我找不到一个可以自行完成技巧的工具,我将使用autoincrement值将所有postgres序列转换为mysql中的自动增量id.

那么,我如何列出Postgres DB(8.1版本)中的所有序列,其中包含有关使用它的表的信息,下一个值与SQL查询的值等?

请注意,我无法使用information_schema.sequences8.4版本中的视图.

Ana*_*thu 217

以下查询给出了所有序列的名称.

SELECT c.relname FROM pg_class c WHERE c.relkind = 'S';
Run Code Online (Sandbox Code Playgroud)

通常,序列命名为${table}_id_seq.简单的正则表达式模式匹配将为您提供表名.

要获取序列的最后一个值,请使用以下查询:

SELECT last_value FROM test_id_seq;
Run Code Online (Sandbox Code Playgroud)

  • `$ {table} _id_seq`提示非常有用 (5认同)
  • `${table}_${column}_seq` 用于自动创建的序列 (3认同)

rav*_*ren 64

请注意,从PostgreSQL 8.4开始,您可以通过以下方式获取有关数据库中使用的序列的所有信息:

SELECT * FROM information_schema.sequences;
Run Code Online (Sandbox Code Playgroud)

由于我使用的是更高版本的PostgreSQL(9.1),并且正在寻找相同的答案高低,我为后人和未来的搜索者添加了这个答案.


小智 54

运行:psql -E,然后\ds

  • @avastreg:JUST DO IT*ONCE*.它会告诉你查询! (10认同)

ape*_*ari 25

经过一点点痛苦,我明白了.

实现这一目标的最佳方法是列出所有表格

select * from pg_tables where schemaname = '<schema_name>'
Run Code Online (Sandbox Code Playgroud)

然后,对于每个表,列出具有属性的所有列

select * from information_schema.columns where table_name = '<table_name>'
Run Code Online (Sandbox Code Playgroud)

然后,对于每列,测试它是否有序列

select pg_get_serial_sequence('<table_name>', '<column_name>')
Run Code Online (Sandbox Code Playgroud)

然后,获取有关此序列的信息

select * from <sequence_name>
Run Code Online (Sandbox Code Playgroud)


jia*_*ian 14

获取所有序列:

select * from pg_sequences;
Run Code Online (Sandbox Code Playgroud)

PSQL:

\ds
\ds+
\ds *actor*
Run Code Online (Sandbox Code Playgroud)

\ds *actor*将获取序列名称包含演员角色的所有序列。


cms*_*cms 11

自动生成的序列(例如为SERIAL列创建的序列)与父表之间的关系由序列所有者属性建模.

您可以使用ALTER SEQUENCE命令的OWNED BY子句修改此关系

例如,由foo_schema.foo_table提供的ALTER SEQUENCE foo_id

将其设置为链接到表foo_table

或更改序列foo_id由NON所拥有

打破序列和任何表之间的连接

有关此关系的信息存储在pg_depend目录表中.

加入关系是pg_depend.objid - > pg_class.oid之间的链接WHERE relkind ='S' - 它将序列链接到连接记录,然后是pg_depend.refobjid - > pg_class.oid WHERE relkind ='r',它链接了将记录加入拥有关系(表)

此查询返回数据库中的所有序列 - >表依赖项.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' ;
Run Code Online (Sandbox Code Playgroud)


bbh*_*bbh 9

序列信息:最大值

SELECT * FROM information_schema.sequences;

序列信息:最后一个值

SELECT * FROM <sequence_name>


mas*_*ost 6

我知道这个问题是关于 postgresql 8 版的,但我在这里为想要在 10 版及更高版本中获取序列的人写了这个简单的方法

您可以使用波纹管查询

select * from pg_sequences
Run Code Online (Sandbox Code Playgroud)

查看-pg-序列


小智 5

我知道这篇文章很老,但是我发现CMS的解决方案非常有用,因为我正在寻找一种自动方法来将序列链接到表AND列,并希望共享。使用pg_depend目录表是关键。我将执行的操作扩展为:

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,
       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' ;
Run Code Online (Sandbox Code Playgroud)

此版本将列添加到返回的字段列表中。有了表名和列名,对pg_set_serial_sequence的调用可以很容易地确保正确设置数据库中的所有序列。例如:

CREATE OR REPLACE FUNCTION public.reset_sequence(tablename text, columnname text)
 RETURNS void
 LANGUAGE plpgsql
AS $function$
DECLARE
    _sql VARCHAR := '';
BEGIN
    _sql := $$SELECT setval( pg_get_serial_sequence('$$ || tablename || $$', '$$ || columnname || $$'), (SELECT COALESCE(MAX($$ || columnname || $$),1) FROM $$ || tablename || $$), true)$$;
    EXECUTE _sql;
END;
$function$;
Run Code Online (Sandbox Code Playgroud)

希望这对重置序列有帮助!