Невозможно вставить запись из-за "неправильного литерала записи" - PullRequest
5 голосов
/ 03 марта 2012

Следующая проблема поставила меня в тупик

SELECT string_agg(e.enumlabel, '|') as enum_value
FROM pg_type t 
   JOIN pg_enum e on t.oid = e.enumtypid  
   JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace 
WHERE typname = 'contacts'

above|below|lateral|lateral-bottom|lateral-top|within

CREATE TABLE unit_contacts
(
  id integer NOT NULL DEFAULT nextval('unit_contacts_id_seq1'::regclass),
  unit_id integer NOT NULL,
  old_contact contacts NOT NULL,
  contact contacts NOT NULL,
  old_with_unit integer NOT NULL,
  with_unit integer NOT NULL,
  CONSTRAINT unit_contacts__pkey PRIMARY KEY (id )
)
WITH (
  OIDS=FALSE
);

mm=> INSERT INTO unit_contacts VALUES (15, 1, 'below', 'below', 8112, 2);
ERROR:  malformed record literal: "below"
LINE 1: ...SERT INTO unit_contacts VALUES (15, 1, 'below', '...

Я не могу понять, почему я вообще не могу вставить строку.

1 Ответ

5 голосов
/ 03 марта 2012

Очевидно, вы столкнулись с конфликтом имен.

Сообщение об ошибке для отсутствующего значения 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...