gpt4 book ai didi

PostgreSQL bigserial 和 nextval

转载 作者:行者123 更新时间:2023-11-29 11:38:42 26 4
gpt4 key购买 nike

我有一个 PgSQL 9.4.3 服务器设置,之前我只使用公共(public)模式,例如我创建了一个这样的表:

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 显示带有 nextval?

bigint

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

最佳答案

仅仅是符号上的便利

根据documentation on Serial Typessmallserialserialbigserial 不是真正的数据类型。相反,它们是同时创建 sequence 的符号。和列 default value指向那个序列。

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

更新

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

关于PostgreSQL bigserial 和 nextval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31035830/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com