首页 > 解决方案 > 序列必须具有与其链接到的表相同的所有者

问题描述

有以下 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;

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

标签: postgresqlsequence-sql

解决方案


引文:

由 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>  │
└────────┴────────────┴───────┴─────────┘

价值是你的<name>目标

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

┌────────┬──────────┐
│ schema │ relowner │
├────────┼──────────┤
│ public │  <name>  │
└────────┴──────────┘

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

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

最后,序列已经存在:

alter sequence test_table_seq owner to <name>;

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

现在,您的序列满足上述条件,您可以将其与 table.column 关联


推荐阅读