PostgreSQL bigserial& NEXTVAL

时间:2015-06-24 19:57:49

标签: postgresql

我有一个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中显示bigint一个nextval

两者都按预期工作。我只是不明白为什么架构的差异会显示不同的表创建。我意识到bigint和bigserial允许使用相同数量的整数。

2 个答案:

答案 0 :(得分:8)

仅仅是符号方便

根据documentation on Serial Typesfinish()smallserialserial不是真正的数据类型。相反,它们是同时创建sequencedefault value指向该序列的列的符号。

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

更新

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

答案 1 :(得分:1)

以标准方式创建串行列时:

;WITH cte AS(
    SELECT zone, date, active, ROW_NUMBER() OVER(PARTITION BY zone ORDER BY date) as rowNo
    FROM #test
)
SELECT cur.zone, cur.active as curStatus, prev.active as prevStatus, cur.date, prev.date, DATEDIFF(MINUTE,prev.date, cur.date) as diffInMinutes 
FROM cte as cur
INNER JOIN cte as prev
        ON cur.zone = prev.zone
        AND cur.rowNo-1 = prev.rowNo

Postgres使用命令创建一个序列:

CREATE TABLE new_table (
    new_id serial);

From documentation OWNED BY选项导致序列与特定的表列相关联,这样如果删除该列(或其整个表),序列也将自动删除

序列的标准名称是根据表名,列名和后缀CREATE SEQUENCE new_table_new_id_seq ... ALTER SEQUENCE new_table_new_id_seq OWNED BY new_table.new_id; 构建的。

如果以这种方式创建了一个串行列,PgAdmin会将其类型显示为_seq

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