sql - 由于命名冲突无法创建表

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

并得到错误。

最佳答案

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/

相关文章:

java - Hibernate Result Transformer 无法实例化 resultclass

ios - 使用 sqlite3_column_text() 获取整数值

arrays - PostgreSQL 中 json 数组值的交集

linux - 在 Oracle linux 7 上安装 Oracle 11gR2 - OS 内核参数 “semmni” 的先决条件失败

sql - 删除具有特权的角色

SQL 子查询同一个表中的所有数据

MySql并发问题

c - postgresql解析器将表名放在哪里?

postgresql - PostgreSQL 可以在过程中声明过程吗?

mysql - 选择 STR_TO_DATE( ('20190919 114121' , "%Y-%m-%d %T");