如何通过前缀下划线重命名PostgreSQL表



我有一个依赖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"这样的前缀而不是"_"吗?或者可以重命名它吗?我唯一感兴趣的是维护表中的信息,同时对表名进行最小的更改。

不能简单地在现有表名前面加下划线,因为每个表都有一个关联类型,该类型是……表名前面的前导下划线。您可以在pg_catalog.pg_type表中对此进行验证。表名以下划线开头不是问题,但内部过程是从旧表中物理创建新表,只有当其他进程不再使用旧表时,才会删除旧表及其关联类型。因此,引用类型(而不是关系)时出错。

因此,如果您真的想保留带下划线的旧名称,则应该首先将ALTER TABLE转换为某个临时名称,然后将ALTER TABLE转换为下划线+原始名称。或者简单地使用另一个前缀。。。

错误:类型"_my_table"已存在

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

最新更新