Очевидно, вы столкнулись с конфликтом имен.
Сообщение об ошибке для отсутствующего значения enum
будет:
ERROR: invalid input value for enum rainbow: "below"
LINE 1: INSERT INTO t VALUES (1, 'below');
Ваше сообщение об ошибке показывает, что существует составной тип с тем же именем, который, скорее всего, происходит из таблицы с тем же именем . Вам следует избегать использования одинаковых имен !
Для широкой публики, чтобы воспроизвести, рассмотрим следующую демонстрацию:
CREATE TYPE contacts AS ENUM ('above', 'below', 'lateral');
SELECT 'above'::contacts; -- all good, before the next step
CREATE TEMP TABLE contacts (id int, x text); -- !the crucial part
SELECT string_agg(e.enumlabel, '|') as enum_value
FROM pg_type t
JOIN pg_enum e on t.oid = e.enumtypid
WHERE t.typname = 'contacts'; -- all good
CREATE TEMP TABLE t (id int, r contacts);
INSERT INTO t VALUES (1, 'above'); -- ERROR
SELECT 'above'::contacts; -- same ERROR
Это может произойти, только если enum
тип и таблица (тип строки) существуют в двух разных схемах . PostgreSQL не позволил бы оба в той же схеме. В вашем случае схема со схемой таблицы (составной тип) явно предшествует схеме типа enum
в search_path при создании таблица . Или, может быть, типа enum
в то время даже не существовало. См:
В моем примере временная таблица стоит первой, потому что схема pg_temp
стоит первой в пути поиска по умолчанию. При создании таблицы contacts
разрешается в качестве типа строки (pg_temp.contacts
), а не типа enum
(public.contacts
).
Если вы должны иметь таблицу и enum
с тем же именем, убедитесь, что квалифицирует схему имен типов в использовании. В моем примере:
pg_temp.contacts -- the composite type
public.contacts -- the enum type