我正在尝试在我的数据库中创建一个表,但出现以下错误。
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.
并得到错误。
最佳答案
Postgres 为每个表创建一个同名的复合(行)类型。这就是错误消息提到“类型”而不是“表格”的原因。实际上,表名不能与来自 the manual on pg_class
的列表冲突:
r
= ordinary table,i
= index,S
= sequence,t
= TOAST table,v
= view,m
= materialized view,c
= composite type,f
= foreign table,p
= partitioned table,I
= partitioned index
大胆强调我的。因此,您可以找到任何与此查询冲突的条目:
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;
关于sql - 由于命名冲突无法创建表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22343877/