序列必须与它所链接的表具有相同的所有者

use*_*591 1 postgresql sequence-sql

有以下sql,最后一行出错, ERROR: sequence must have same owner as table it is linked to [Failed SQL: (0) ALTER SEQUENCE test_table_seq OWNED BY test_table.id

CREATE SEQUENCE test_table_seq;

ALTER TABLE test_table ALTER COLUMN id SET DEFAULT nextval('test_table_seq');
ALTER TABLE test_table ALTER COLUMN id SET NOT NULL;
ALTER SEQUENCE test_table_seq OWNED BY test_table.id;
Run Code Online (Sandbox Code Playgroud)

任何建议如何避免该错误?谢谢!!!!

Abe*_*sto 5

引文:

由 table_name.column_name 拥有

OWNED BY 选项使序列与特定的表列相关联,这样如果删除该列(或其整个表),该序列也将自动删除。如果指定,此关联将替换之前为序列指定的任何关联。指定的表必须与序列具有相同的所有者并处于相同的架构中。指定 OWNED BY NONE 将删除任何现有关联,使序列“独立”。

所以,第一步:了解源表的所有者。一如既往,有几种方法。最普遍的:

  1. 使用psql
\dt test_table;
           List of relations
?????????????????????????????????????????
? Schema ?    Name    ? Type  ?  Owner  ?
?????????????????????????????????????????
? public ? test_table ? table ? <name>  ?
?????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

其中,<name>价值是你的目标

  1. 使用查询:
select
  relnamespace::regnamespace as "schema",
  relowner::regrole
from pg_class where relname = 'test_table';

?????????????????????
? schema ? relowner ?
?????????????????????
? public ?  <name>  ?
?????????????????????
Run Code Online (Sandbox Code Playgroud)

再次,<name>是你的目标。

请注意,此处未将架构指定为条件。如果您的表在架构中不同,public那么它可能会更复杂一点。

最后,序列已经存在:

alter sequence test_table_seq owner to <name>;
Run Code Online (Sandbox Code Playgroud)

其中<name>是来自上一步之一的值。

现在你的序列满足上面提到的条件,你可以将它与 table.column 相关联