我正在尝试在我的数据库中创建一个表,它会给我以下错误。
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.
并收到错误。
答案 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'