在PostgreSQL中有两种类型的序列:
INFORMATION_SCHEMA.SEQUENCES返回两种类型的序列。
SQL语句可以获取特定架构的序列序列列表(不包括数据库生成的序列)?
P.S。:我正在使用PostgreSQL 9
答案 0 :(得分:5)
对于生成的序列,将自动定义“拥有”列,以便可以成为区别因素。
但这也可以手动完成,所以没有办法区分:
create table foo (
id_col serial not null
);
和
create table foo (
id_col integer not null
);
create sequence foo_id_col_seq owned by foo.id_col;
但是,如果您可以这样做,以下声明可以为您提供这些信息:
SELECT s.relname as sequence_name,
t.relname as related_table,
a.attname as related_column,
d.deptype
FROM pg_class s
JOIN pg_depend d ON d.objid = s.oid
LEFT JOIN pg_class t ON d.refobjid = t.oid
LEFT JOIN pg_attribute a ON (d.refobjid, d.refobjsubid) = (a.attrelid, a.attnum)
WHERE s.relkind = 'S';
该查询将为每个序列至少获得一行:依赖于创建它的模式。
对于列所拥有的序列,您将获得另一行,其中包含所属的表和列。
答案 1 :(得分:0)
唯一的区别可能(至少)是定义它的地方。输入\d yourtable
会将修饰符列中的序列号列为nextval(...),但之后定义的序列不会。 pg_catalog.attr_def
将数据保存到用于定义的实际字符串中。
我同意马的功能,没有区别。它类似于在一行或两行上声明某些内容,但同样恰当的事情发生了。 DB正在生成所有这些序列,并且没有用户序列。唯一的区别在于它们的声明方式以及此信息持久化的唯一方法是定义列的实际字符串保存在系统目录中。
从系统表中:
create view check_seq as
SELECT a.attname,
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 "column def"
FROM pg_catalog.pg_attribute a
join pg_catalog.pg_class c on a.attrelid = c.oid
WHERE a.attnum > 0 AND NOT a.attisdropped
and c.relname in ('foo')
ORDER BY a.attnum
;
示例:
create table foo (
id_col serial not null
);
select * from check_seq;
attname | relname | column def
---------+---------+-------------------------------------
id_col | foo | nextval('foo_id_col_seq'::regclass)
drop table foo;
create table foo (
id_col integer not null
);
create sequence foo_id_col_seq owned by foo.id_col;
select * from check_seq;
attname | relname | column def
---------+---------+------------
id_col | foo |