我刚刚完成了对现有表的分区,方法是 1) 重命名原始表 2) 创建一个与原始表具有相同结构的新分区表,以及 3) 将数据从旧的未分区表传输到新表。
分区工作得很好,没有问题。唯一的问题是我现在有两个具有相同字段的表,它们都使用相同的序列
ident integer NOT NULL DEFAULT nextval('mytable_ident_seq'::regclass)
Run Code Online (Sandbox Code Playgroud)
问题 - 如何删除原始表格?
我无法删除原始表,因为这样做 Postgres 会尝试删除序列,这会导致错误,因为“其他对象依赖于它”,而“其他对象”是我新创建的分区版本。
我尝试的第一件事是删除对序列的引用
ALTER TABLE mytable_old ALTER COLUMN ident SET DEFAULT 0;
Run Code Online (Sandbox Code Playgroud)
这似乎有效,它没有返回任何错误,但是当我查看该字段的属性时,它仍然说它依赖于序列,当我尝试删除表时,我得到了同样的错误。该表目前有零行数据,我已经删除了除这一行之外的所有字段,但我仍然无法实际删除表本身。
这不是一个严重错误,数据库工作正常,新版本的表已分区并且工作正常,为了整洁,我只想删除旧表。
您可能正在使用一种serial数据类型。
PostgreSQL 文档说这等效于以下内容:
CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename (
colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;
Run Code Online (Sandbox Code Playgroud)
请注意最新的声明。
基于https://www.postgresql.org/docs/current/sql-altersequence.html,您需要删除“所有权”依赖项:
指定 OWNED BY NONE 将删除任何现有关联,使序列“独立”。
在您的情况下,这意味着:
ALTER SEQUENCE mytable_ident_seq OWNED BY NONE;
Run Code Online (Sandbox Code Playgroud)
或者您可能需要使用以下方法将其与正确的表重新关联:
ALTER SEQUENCE mytable_ident_seq OWNED BY table_name.column_name;
Run Code Online (Sandbox Code Playgroud)
之后,您应该能够删除表而不会对序列产生影响。
| 归档时间: |
|
| 查看次数: |
1887 次 |
| 最近记录: |