LINUX.ORG.RU

Как сделать INSERT в таблицу, у которой есть RULE?

 , ,


0

2

Имеется таблица calc, для которой написано правило:

CREATE RULE rule_insert_calc AS
ON INSERT TO calc 
DO  SELECT pg_notify('notify_insert_calc'::text, (new.id)::text) AS pg_notify;
В таблице, как видно из этого кода, есть поле id.

Теперь надо сделать команду INSERT так, чтобы если значение id уже есть в таблице, то запись не добавлялась.

Интернет советует писать так:
INSERT INTO calc (...) VALUES (...) ON CONFLICT (id) DO NOTHING;
Однако такой SQL-запрос вызывает ошибку:
INSERT c предложением ON CONFLICT нельзя использовать с таблицей, для которой заданы правила INSERT или UPDATE


Вопрос: как добавить данные в таблицу с RULE так, чтобы не добавлялись записи с уже существующими id?

★★★★★

Последнее исправление: Dimez (всего исправлений: 2)

Ага, видимо можно использовать результат подзапроса:

INSERT INTO calc (id, other_column)
SELECT <new_id>, 'new_value'
WHERE NOT EXISTS (
    SELECT 1 FROM calc WHERE id = <new_id>
);

Но тогда синтаксис задания значений через VALUES работать не будет, и надо использовать «хак» через SELECT.

Xintrea ★★★★★
() автор топика
Последнее исправление: Xintrea (всего исправлений: 1)

Ты используешь эти инструменты не по назначению. Стоит подумать над более правильным решением исходной задачи. Решение в комментарии тоже делает что-то странное. Триггеры - возможно, но кажется что в таком случае ON CONFLICT не должен быть нужен, впрочем по текущей постановке вопроса ничего сказать нельзя.

ei-grad ★★★★★
()
Ответ на: комментарий от ei-grad

Ты используешь эти инструменты не по назначению.

Давай-ка расскажи, какие инструменты надо использовать по назначению, чтобы информировать другую программу об изменениях в таблицах через механизм нотификаций.

Xintrea ★★★★★
() автор топика

Заливать документы под владельцем схемы. На него по умолчанию не действуют правила и соответственно хак с «on conflict» должОн проходить.

vtVitus ★★★★★
()
Ответ на: комментарий от theNamelessOne

мне вообще кажется эта идея плохой - делать автоматом. лично у меня кто допустим insert сделает, он же нотифай последним стейтментом делает, и никаких триггеров, при этом в транзакции на все изменения один нотифай. какой смысл плодить их сотню чтобы потом одним разом всю сотню выплюнуть, слушателю это не надо, ему одного достаточно

asdpm
()
Ответ на: комментарий от theNamelessOne

согласен, тем более, я всмотрелся сейчас, у него видимо слушатели не определяют сами которое новое, которое нет, возможно поэтому айдишник сообщает

asdpm
()
Ответ на: комментарий от theNamelessOne

Нет, конечно, и не уверен и не знаю. Но 9.6 держать в проде можно только из-за подобных решений. Новые версии прилично обогнали в производительности: https://www.opennet.ru/opennews/art.shtml?num=61042

Dimez ★★★★★
()
Ответ на: комментарий от Dimez

Глянь его темы, они там часто используют протухшие версии ПО. Наверно, связано с сертификацией:

в моем случае неприменимо, т. к. система сертифицирована и замена пакетов не допускается.

theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 1)