Postgresql中有问题的无名表

Akh*_*oes 10 database postgresql postgresql-9.0

我实际上不知道我是怎么做到的:但是我的postgres数据库中有一个无名表.不用说,这样的表是有问题的,它不会被删除,也不会以任何方式改变它.

以下是pgAdmin资源管理器中的外观图:

无名表

至于它的声明,它是这样的:

CREATE TABLE 
(
  _id_ integer NOT NULL DEFAULT nextval('bu_b__id__seq'::regclass),
  pt_utilisateur integer,
  pt_date date,
  lon double precision,
  lat double precision,
  CONSTRAINT  PRIMARY KEY (_id_)
)
Run Code Online (Sandbox Code Playgroud)

所以,一个简单的问题:如何删除这个表(因为尝试删除它来使用它的名称......它不存在!)?

问候.

A.H*_*.H. 6

如果这是不是关于一个表,该表的名字是不是由于编码/字体的问题,你可以做到这一点显示:

  • 从系统目录中确定表OID.
  • 将系统目录中的新表名设置为临时名称.使用OID作为标识符
  • 将表重新重命名为有用的(或者只删除它).

当然,这假定您拥有对数据库的超级用户访问权限.

第一步 - 从目录中确定OID:

SELECT oid, relname FROM pg_class WHERE length(relname) <= 1;
Run Code Online (Sandbox Code Playgroud)

如果你没有得到任何结果,那么表一个名字 - 它只是不可显示.在这种情况下,只需跳过WHERE部分,用眼睛看.

第二步 - 更改系统目录:

UPDATE pg_class SET relname = 'foo' WHERE oid = /*OID from step 1*/;
Run Code Online (Sandbox Code Playgroud)

无论如何 - 不要停在这里,你必须继续.

第三步 - 清理

PostgreSQL将表名存储在多个位置(例如pg_type).有些工具可能依赖于此.要清理它,你必须删除表(因此删除未发表的东西)或者你必须使用官方工具重新命名表.

ALTER TABLE foo RENAME TO /*somthing real*/;
Run Code Online (Sandbox Code Playgroud)

要么

DROP TABLE foo;
Run Code Online (Sandbox Code Playgroud)

通常的警告:你正在咀嚼PostgreSQL的内部 - 不要做愚蠢的事情并自行承担风险:-)