postgres,两张表使用相同的顺序,如何删除一张?

Con*_*bil 4 postgresql

我刚刚完成了对现有表的分区,方法是 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)

这似乎有效,它没有返回任何错误,但是当我查看该字段的属性时,它仍然说它依赖于序列,当我尝试删除表时,我得到了同样的错误。该表目前有零行数据,我已经删除了除这一行之外的所有字段,但我仍然无法实际删除表本身。

这不是一个严重错误,数据库工作正常,新版本的表已分区并且工作正常,为了整洁,我只想删除旧表。

Pat*_*zek 7

您可能正在使用一种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)

之后,您应该能够删除表而不会对序列产生影响。