ape*_*ari 130 sql database migration postgresql sequences
我正在将db从postgres转换为mysql.
由于我找不到一个可以自行完成技巧的工具,我将使用autoincrement值将所有postgres序列转换为mysql中的自动增量id.
那么,我如何列出Postgres DB(8.1版本)中的所有序列,其中包含有关使用它的表的信息,下一个值与SQL查询的值等?
请注意,我无法使用information_schema.sequences
8.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)
rav*_*ren 64
请注意,从PostgreSQL 8.4开始,您可以通过以下方式获取有关数据库中使用的序列的所有信息:
SELECT * FROM information_schema.sequences;
Run Code Online (Sandbox Code Playgroud)
由于我使用的是更高版本的PostgreSQL(9.1),并且正在寻找相同的答案高低,我为后人和未来的搜索者添加了这个答案.
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)
序列信息:最大值
SELECT * FROM information_schema.sequences;
序列信息:最后一个值
SELECT * FROM <sequence_name>
我知道这个问题是关于 postgresql 8 版的,但我在这里为想要在 10 版及更高版本中获取序列的人写了这个简单的方法
您可以使用波纹管查询
select * from pg_sequences
Run Code Online (Sandbox Code Playgroud)
小智 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)
希望这对重置序列有帮助!
归档时间: |
|
查看次数: |
145831 次 |
最近记录: |