由于命名冲突而无法创建表

smn*_*cks 3 sql postgresql database-administration

我试图在数据库中创建一个表,它给我以下错误。

ERROR:  type "tbl_last_alert" already exists
HINT:  A relation has an associated type of the same name, so you must use a name that doesn't conflict with any existing type.
Run Code Online (Sandbox Code Playgroud)

然后我认为该表必须存在,所以我运行了以下查询:

select * from pg_tables;
Run Code Online (Sandbox Code Playgroud)

但是找不到任何东西。然后我尝试了:

select * from tbl_last_alert;
ERROR:  relation "tbl_last_alert" does not exist
Run Code Online (Sandbox Code Playgroud)

知道如何排序吗?

我想通过重命名类型

ALTER TYPE v4report.tbl_last_alert RENAME TO tbl_last_alert_old;
ERROR:  v4report.tbl_last_alert is a table's row type
HINT:  Use ALTER TABLE instead.
Run Code Online (Sandbox Code Playgroud)

并得到错误。

Erw*_*ter 5

Postgres为每个表创建一个具有相同名称的复合类型。这就是为什么错误消息中提到“类型”而不是“表”的原因。实际上,表名不能与以下内容冲突:

r =普通表,i =索引,S =序列,v =视图,m =实例化视图,c =复合类型,t = TOAST表,f =外部表

引文来自的手册pg_class。大胆强调我的。因此,您可以在此查询中找到任何冲突的条目:

SELECT n.nspname AS schemaname, c.relname, c.relkind
FROM   pg_class c
JOIN   pg_namespace n ON n.oid = c.relnamespace
WHERE  relname = 'tbl_last_alert';
Run Code Online (Sandbox Code Playgroud)

这涵盖了所有可能的竞争对手,而不仅仅是类型。请注意,同一名称可以在多个模式中多次存在-但不能在同一模式中。

治愈

如果发现有冲突的复合类型,则可以重命名或删除它以让路-如果不需要的话!

DROP TYPE tbl_last_alert;
Run Code Online (Sandbox Code Playgroud)

确保类型的架构是搜索路径中的第一个匹配项,或者确保架构限定名称。我将架构添加到上面的查询中。喜欢:

DROP TYPE public.tbl_last_alert;
Run Code Online (Sandbox Code Playgroud)

  • @smn_onrocks在执行其他任何操作之前,请遵循以下建议:http://wiki.postgresql.org/wiki/Corruption (2认同)