错误:在 Postgres 中发现了不止一个拥有的序列

Nay*_*ani 3 postgresql identity-column database-sequence

我正在为Patient表的现有列设置标识列。
在这里,我想使用GENERATED ALWAYS AS IDENTITY

因此,我使用以下语句设置了标识列(以前是serial):

ALTER TABLE Patient ALTER PatientId
   ADD GENERATED ALWAYS AS IDENTITY (START WITH 1);
Run Code Online (Sandbox Code Playgroud)

对于现有的患者表,我总共有 5 条记录。( patientId1 到 5)
当我在身份设置后插入新记录时,它会抛出如下错误:

more than one owned sequence found
Run Code Online (Sandbox Code Playgroud)

即使在重置标识列后,我仍然遇到相同的错误。

ALTER TABLE Patient ALTER COLUMN PatientId RESTART WITH 6;
Run Code Online (Sandbox Code Playgroud)

如果您有任何解决方案,请告诉我。

Lau*_*lbe 9

更新:此错误已在 PostgreSQL v12 中修复,提交19781729f78
答案的其余部分与旧版本相关。

一个serial列有一个属于该列的序列和一个DEFAULT获取净序列值的值。

如果您尝试将该列更改为标识列,您将收到一个错误,指出该列已经有一个默认值。

现在您必须删除默认值,而不是属于该serial列的序列。然后,当您将该列转换为标识列时,会创建该列拥有的第二个序列。

现在,当您尝试插入一行时,PostgreSQL 尝试查找并使用该列拥有序列,但有两个,因此出现错误消息。

我认为这是 PostgreSQL 中的一个错误:在我看来,它应该重新调整标识列的现有序列的用途,或者给您一个错误,表明该列已经拥有一个序列,您应该删除它。我会努力修复这个错误

同时,您应该手动删除serial列中留下的序列。运行以下查询:

SELECT d.objid::regclass
FROM pg_depend AS d
   JOIN pg_attribute AS a ON d.refobjid = a.attrelid AND
                             d.refobjsubid = a.attnum
WHERE d.classid = 'pg_class'::regclass
  AND d.refclassid = 'pg_class'::regclass
  AND d.deptype <> 'i'
  AND a.attname = 'patientid'
  AND d.refobjid = 'patient'::regclass;
Run Code Online (Sandbox Code Playgroud)

这应该为您提供从serial列中留下的序列的名称。删除它,标识列应该按需要运行。