postgresql - 序列必须具有与其链接到的表相同的所有者
问题描述
有以下 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;
任何建议如何避免该错误?谢谢!!!!
解决方案
引文:
由 table_name.column_name 拥有
OWNED BY 选项使序列与特定表列相关联,这样如果删除该列(或其整个表),该序列也将自动删除。如果指定,此关联将替换之前为该序列指定的任何关联。指定的表必须与序列具有相同的所有者并且在相同的模式中。指定 OWNED BY NONE 会删除任何现有的关联,使序列“独立”。
所以,第一步:了解源表所有者。与往常一样,有几种方法。最常见的:
- 使用
psql
:
\dt test_table;
List of relations
┌────────┬────────────┬───────┬─────────┐
│ Schema │ Name │ Type │ Owner │
├────────┼────────────┼───────┼─────────┤
│ public │ test_table │ table │ <name> │
└────────┴────────────┴───────┴─────────┘
价值是你的<name>
目标
- 使用查询:
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 关联
推荐阅读
- arrays - 检查是否存在索引 k 使得数组 A[] 的元素顺时针移动形成一个反向双调数组
- html - 如何设置 Vue Core UI 选择值
- c# - 使用 JsonConvert.DeserializeObject,如何警告缺少成员,但继续反序列化?
- vba - 如何使用 VB 脚本完全关闭 Word 应用程序
- c# - DATAGRIDVIEW 比较中的输入字符串格式不正确
- python - 为什么相同对象的内存空间分配不同?
- ruby - 红宝石如何比较两个日期(或任何其他对象)
- powershell - 使用 PowerShell Invoke-RestMethod 发布多部分正文
- flutter - 使用 DateFormat 抖动 HTTP 日期字符串
- list - OCaml 中的递归函数