我有一个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允许使用相同数量的整数。
答案 0 :(得分:8)
根据documentation on Serial Types,finish()
,smallserial
和serial
不是真正的数据类型。相反,它们是同时创建sequence和default 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
显示为默认值。