PostgreSQL bigserial & nextval

5

我已经搭建好了一个 PgSQL 9.4.3 服务器,之前我只使用公共模式。例如,我创建了一个如下的表:

CREATE TABLE ma_accessed_by_members_tracking (
    reference bigserial NOT NULL,
    ma_reference bigint NOT NULL,
    membership_reference bigint NOT NULL,
    date_accessed timestamp without time zone,
    points_awarded bigint NOT NULL
);

使用Windows程序PgAdmin III,我可以看到它创建了正确的信息和序列。
然而,最近我向同一数据库添加了另一个模式名为“test”,并创建了完全相同的表格,就像以前一样。
但是这次我看到:
CREATE TABLE test.ma_accessed_by_members_tracking
(
  reference bigint NOT NULL DEFAULT nextval('ma_accessed_by_members_tracking_reference_seq'::regclass),
  ma_reference bigint NOT NULL,
  membership_reference bigint NOT NULL,
  date_accessed timestamp without time zone,
  points_awarded bigint NOT NULL
);

我的问题/好奇心是为什么在一个public模式中,reference显示bigserial,但在test模式中reference显示bigintnextval
两者都按预期工作。我只是不明白为什么模式的差异会显示不同的表创建。我意识到bigint和bigserial允许使用相同数量的整数。
2个回答

9

仅仅是符号便利

根据Serial Types文档,smallserialserialbigserial并不是真正的数据类型。它们只是一种表示方式,可以同时创建序列和指向该序列的具有默认值的列。

我在模式public上创建了测试表格。命令psql \d显示bigint列类型。也许这是PgAdmin的行为?

更新

我检查了PgAdmin源代码。在函数pgColumn::GetDefinition()中,它扫描表格pg_depend以查找自动依赖关系,并在找到时用bigserial替换bigint,以模拟原始表格创建代码。


2
这篇文章甚至没有试图回答问题。 - Adam Piotrowski
1
我检查了PgAdmin的源代码。在函数pgColumn :: GetDefinition()中,它扫描表pg_depend以获取自动依赖关系,并在找到它时将bigint替换为bigserial以模拟原始表创建代码。 - Tomasz Myrta
@TomaszMyrta, 我建议你把有关源代码的评论加入到你的回答中,这样可以更全面、明确地回答问题。 - Basil Bourque

0
在标准方式下创建序列列时:
CREATE TABLE new_table (
    new_id serial);

Postgres使用以下命令创建序列:

CREATE SEQUENCE new_table_new_id_seq ...
ALTER SEQUENCE new_table_new_id_seq OWNED BY new_table.new_id;

来自文档OWNED BY选项会导致序列与特定表列相关联,因此如果删除该列(或整个表),序列也将被自动删除。

序列的标准名称由表名、列名和后缀_seq构建。

如果以这种方式创建了序列列,PgAdmin会将其类型显示为serial

如果序列具有非标准名称或未与列相关联,则PgAdmin将nextval()显示为默认值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接