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)
如果您有任何解决方案,请告诉我。
更新:此错误已在 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列中留下的序列的名称。删除它,标识列应该按需要运行。
| 归档时间: |
|
| 查看次数: |
3611 次 |
| 最近记录: |