2014-10-29 98 views
1

我有一个依赖于PostgreSQL系统的数据库,我维护它,所以我想改变表和整体方案。为此,我想重新命名旧表,以便它们以下划线作为前缀。但是,这是行不通的:如何通过为下划线加前缀来重命名PostgreSQL表?

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

ALTER TABLE my_table 
    RENAME TO _my_table; 

查询的结果如下:

NOTICE: table "_my_table" does not exist, skipping ERROR:
type "_my_table" already exists
********** Error **********

ERROR: type "_my_table" already exists SQL state: 42710

的“_my_table”表是假名字,但这个错误是由实际创建一个“_my_table转载'表并运行上述相同的脚本。

我使用pgAdmin III来访问数据库表,并使用它的'重命名'操作导致相同的错误。 的ALTER TABLE方法PostgreSQL文档并没有告诉我关于明确这个特殊的问题:http://www.postgresql.org/docs/9.3/static/sql-altertable.html

我真的需要使用像“备份”,而不是“_”前缀?或者可以重新命名它,我唯一的兴趣是将表中的信息保留在表中,同时对表名进行微小的更改。

回答

3

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

所以,如果你真的想保留旧名称的下划线,你应该首先ALTER TABLE某些临时名称,然后ALTER TABLE下划线+原来的名称。或者只是使用另一个前缀...

1

ERROR: type "_my_table" already exists

这两种表和类型都存储在内部表pg_class中。一个独特的名字是必需的,这就是为什么你得到这个错误信息。