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

时间:2014-03-12 06:42:36

标签: 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.

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

select * from pg_tables;

但找不到任何东西。然后我试了一下:

select * from tbl_last_alert;
ERROR:  relation "tbl_last_alert" does not exist

知道怎么排序吗?

我想通过

来重命名这个类型
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.

并收到错误。

4 个答案:

答案 0 :(得分:4)

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';

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

固化

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

DROP TYPE tbl_last_alert;

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

DROP TYPE public.tbl_last_alert;

答案 1 :(得分:1)

如果您无法删除类型,请将其从pg_type中删除:

DELETE FROM pg_type where typname~'tbl_last_alert';

答案 2 :(得分:0)

错误称它为"类型&#34 ;;你可能在某处有一个具有该名称的类型。

psql中使用此功能查找内容:

\d tbl_last_alert

答案 3 :(得分:0)

您可以在pg_type表中查看:

select * from pg_type where typname = 'tbl_last_alert'