Когда я создаю ПРАВИЛО обновления рядом с предложением CONFLICT, возникает эта ошибка.
Вот мой код конфликта
insert_query = "INSERT INTO my_company (id, name, login, logout) VALUES %s\
ON CONFLICT (id) DO NOTHING"
мое обновление ПРАВИЛО
CREATE RULE log_shoelace AS ON UPDATE TO my_company
WHERE NEW.login <> OLD.login or NEW.logout <> OLD.logout
DO INSERT INTO my_company VALUES (
new.id, new.name, new.login, new.logout, new.interval_time, current_date);
Поле таблицы my_company содержит id, имя, логин. выход, интервал_время, сегодня.
если какие-либо данные обновляются, вставьте эти данные в ту же таблицу. Но здесь я не могу использовать CONFLICT и RULE одновременно. Так что в этом случае я могу сделать?
Спасибо.
Создание таблицы и создание последовательности для тестирования:
CREATE SEQUENCE IF NOT EXISTS my_company_id_seq;
CREATE TABLE public.my_company
( id integer NOT NULL DEFAULT nextval('my_company_id_seq'::regclass)
, name character varying(50)
, login time without time zone
, logout time without time zone
, interval_time time without time zone
, today date DEFAULT CURRENT_DATE
, CONSTRAINT my_company_pkey PRIMARY KEY (id)
);
INSERT ... ON CONFLICT DO UPDATE
. Мне кажется, что вам вообще не нужно правило. Каковы типы данных дляlogin
иlogout
? Если имtimestamp
, маловероятно, что они когда-либо будут равны. - person J Spratt   schedule 25.03.2019login
илиlogout
являются новыми значениями. Когда вы будете обновлять эту строку? Еслиid
относится к типуSERIAL
,BIGSERIAL
или следует за определенным пользователемSEQUENCE
, когда может возникнуть конфликт там, где вы хотитеDO NOTHING
? - person J Spratt   schedule 25.03.2019RULE
: sqlfiddle.com /#!17/073e9/16. Если я что-то не упустил, вы получите те же результаты, используяINSERT ... ON CONFLICT UPDATE
. За исключением случаев, когда вашRULE
не работает из-за нарушения повторяющегося ключа. - person J Spratt   schedule 25.03.2019