2

我有一个依赖于 PostgreSQL 系统的数据库,我正在维护它,所以我想更改表和整体方案。为此,我想重命名旧表,以便它们有一个下划线作为前缀。但这不起作用:

DROP TABLE IF EXISTS _my_table; -- table does not exists, this does nothing

ALTER TABLE my_table
  RENAME TO _my_table;

查询结果如下:

注意:表“_my_table”不存在,跳过错误:
类型“_my_table”已经存在
**********错误**********

错误:类型“_my_table”已存在 SQL 状态:42710

'_my_table' 表是一个假名,但是通过实际创建一个 '_my_table' 表并运行上面的相同脚本会重现此错误。

我正在使用 pgAdmin III 访问数据库表并使用它的“重命名”操作会导致相同的错误。alter table 方法的 postgresql 文档没有明确告诉我这个特殊问题:http ://www.postgresql.org/docs/9.3/static/sql-altertable.html

我真的需要使用像' backup '这样的前缀而不是'_'吗?或者是否可以重命名它,我唯一的兴趣是维护表中的信息,同时对表名进行最小的更改。

4

2 回答 2

5

您不能简单地将下划线放在现有表名前,因为每个表都有一个关联类型,即......表名前的前导下划线。您可以在pg_catalog.pg_type表中验证这一点。表名以下划线开头不是问题,但内部过程是从旧表物理上创建一个新表,只有当旧表不再被其他进程使用时,旧表和它的关联类型,被删除。因此引用类型(而不是关系)的错误。

因此,如果您真的想保留带有下划线的旧名称,您应该首先ALTER TABLE使用一些临时名称,然后ALTER TABLE使用下划线+原始名称。或者干脆使用另一个前缀...

于 2014-10-29T14:02:57.773 回答
1

错误:类型“_my_table”已经存在

表和类型都存储在内部表 pg_class 中。需要一个唯一的名称,这就是您收到此错误消息的原因。

于 2014-10-29T14:03:18.780 回答