Question

I am trying to create a table in my database and it gives me the following error.

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.

Then I thought that the table must exist so I ran the following query:

select * from pg_tables;

But could not find anything. Then I tried:

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

Any idea how to sort this?

i am tying to rename the type by

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.

and getting the error.

Was it helpful?

Solution

Postgres creates a composite (row) type of the same name for every table. That's why the error message mentions "type", not "table". Effectively, a table name cannot conflict with this list from 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

Bold emphasis mine. Accordingly, you can find any conflicting entry with this query:

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

This covers all possible competitors, not just types. Note that the same name can exist multiple times in multiple schemas - but not in the same schema.

Cure

If you find a conflicting composite type, you can rename or drop it to make way - if you don't need it!

DROP TYPE tbl_last_alert;

Be sure that the schema of the type is the first match in your search path or schema-qualify the name. I added the schema to the query above. Like:

DROP TYPE public.tbl_last_alert;

OTHER TIPS

If you can't drop type, delete it from pg_type:

DELETE FROM pg_type where typname~'tbl_last_alert';

The error calls it a "type"; you probably have a type with that name somewhere.

Use this in psql to find out what anything is:

\d tbl_last_alert

You could check it in pg_type table:

select * from pg_type where typname = 'tbl_last_alert'
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top