Иногда при массовой загрузке данных рекомендуется временно сбрасывать ограничения и индексы на таблицу. Но когда я делаю это, я столкнулся с некоторыми проблемами с зависимостью. Мой упрощенный пример:
CREATE TABLE public.t_place_type
(
id serial NOT NULL,
c_name character varying(100),
CONSTRAINT pk_t_place_type PRIMARY KEY (id)
);
CREATE TABLE public.t_place
(
id serial NOT NULL,
c_name character varying(50),
id_place_type integer,
CONSTRAINT pk_t_place PRIMARY KEY (id),
CONSTRAINT fk_t_place_t_place_type FOREIGN KEY (id_place_type)
REFERENCES public.t_place_type (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
);
CREATE OR REPLACE VIEW public.v_place AS
SELECT p.id,
p.c_name,
pt.c_name AS c_place_type
FROM t_place p
LEFT JOIN t_place_type pt ON pt.id = p.id_place_type
GROUP BY p.id, pt.id, p.c_name;
Мой сценарий:
ALTER TABLE public.t_place DROP CONSTRAINT fk_t_place_t_place_type;
ALTER TABLE public.t_place DROP CONSTRAINT pk_t_place;
ALTER TABLE public.t_place_type DROP CONSTRAINT pk_t_place_type;
Когда я запускаю его, я получаю сообщение об ошибке:
ОШИБКА: невозможно удалить ограничение pk_t_place_type для таблицы t_place_type, поскольку от него зависят другие объекты. ПОДРОБНЕЕ: представление v_place зависит от ограничения pk_t_place_type для таблицы t_place_type.
Мне странно, что view может зависеть от какого-то ограничения. AFAIK postgres не кэширует план выполнения для представления.
Когда я меняю свое мнение таким образом:
CREATE OR REPLACE VIEW public.v_place AS
SELECT p.id,
p.c_name AS c_name,
pt.c_name AS c_place_type
FROM t_place p
LEFT JOIN t_place_type pt ON pt.id = p.id_place_type;
зависимость исчезла, и мой скрипт успешно выполняется.
Итак, мой вопрос: в чем причина этой зависимости между представлением и ограничением.
ИЗМЕНИТЬ
Здесь https://www.postgresql.org/docs/9.5/static/sql-select.html#SQL-GROUPBY в документах postgres говорится:
Когда присутствует GROUP BY или присутствуют какие-либо агрегатные функции, недопустимо, чтобы выражения списка SELECT ссылались на несгруппированные столбцы, кроме как в агрегатных функциях, или когда несгруппированный столбец функционально зависит от сгруппированных столбцов, поскольку в противном случае было бы больше. чем одно возможное значение для несгруппированного столбца. Функциональная зависимость существует, если сгруппированные столбцы (или их подмножество) являются первичным ключом таблицы, содержащей несгруппированный столбец.
Является ли это причиной такого поведения? Даже если у меня нет несгруппированных столбцов в моем представлении?