0

最近我在我的 PostgreSQL 数据库中看到了一个奇怪的场景。我的数据库的信息模式显示的序列名称与实际分配给我的表列的序列名称不同。

问题是:

我有一张桌子 tab_1

id  name 
1   emp1
2   emp2
3   emp3

以前,表的id列 ( integer) 是一个自动生成的字段,其中序列号是在运行时通过 JPA 生成的。(序列名称tab_1_seq:)

我们进行了更改并将表的列更新id为,bigserial并且序列保持在列级别(分配的新序列tab_1_temp_seq:)不再由 JPA 处理。

进行此更改后,几个月内一切正常,之后我们遇到了错误- “此会话中尚未定义序列“tab_1_temp_seq””

在分析这个问题时,我发现为表分配的序列之间存在不匹配。

在表结构中,我们将序列显示为tab_1_temp_seq并且在information_schema表中分配了旧序列 - tab_1_seq

我不确定是什么真正触发了这种情况,因为我们没有管理我们的数据库系统。如果您遇到任何此类问题,请告诉我其根本原因。

查询:

SELECT table_name, column_name, column_default from information_schema.columns where table_name = 'tab_1';

结果 :

table_name   column_name  column_default
tab_1        id           nextval('tab_1_seq::regclass')

以下是在表结构/属性中找到的详细信息:

id      nextval('tab_1_temp_seq::regclass')  

name    varChar
4

1 回答 1

0

也许您正遭受数据损坏的困扰,但很可能您正遭受用于可视化数据库对象的不良工具的困扰。无论程序向您显示“表结构/属性”,您都可能会感到困惑。

要找出真相(DEFAULTPostgreSQL 使用哪个值),请运行:

SELECT pg_get_expr(adbin, adrelid)
FROM pg_attrdef
WHERE adrelid = 'tab1'::regclass;

这也是information_schema.columns将显示的内容,但为了清楚起见,我添加了裸查询。

DEFAULT只要INSERT语句没有指定id列或用特殊值填充它,就会使用这个值DEFAULT

也许混乱也是由可能以它们的方式设置默认值的不同程序引起的。我上面展示的方式是 PostgreSQL 的方式,但是没有什么可以阻止第三方工具使用自己的序列来填充id.

于 2019-02-26T08:16:01.600 回答