psycopg2.NotSupportedError: INSERT с предложением ON CONFLICT нельзя использовать с таблицей, имеющей правила INSERT или UPDATE.

Когда я создаю ПРАВИЛО обновления рядом с предложением 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) 
);

person Prosenjit    schedule 25.03.2019    source источник
comment
Вы хотите вставить при конфликте или обновить при конфликте? Похоже, вы пытаетесь выполнить INSERT ... ON CONFLICT DO UPDATE. Мне кажется, что вам вообще не нужно правило. Каковы типы данных для login и logout? Если им timestamp, маловероятно, что они когда-либо будут равны.   -  person J Spratt    schedule 25.03.2019
comment
вход в систему и выход из системы оба имеют тип данных TIME   -  person Prosenjit    schedule 25.03.2019
comment
мой конфликт для вставки и правило для обновления   -  person Prosenjit    schedule 25.03.2019
comment
но без создания ПРАВИЛА, как я могу вставить данные в сегодняшние поля, когда что-то будет обновлено?   -  person Prosenjit    schedule 25.03.2019
comment
Я думаю, мне трудно определить, когда вы хотите обновить и когда вы хотите вставить новую строку. Похоже, вы хотите вставить новую строку, когда login или logout являются новыми значениями. Когда вы будете обновлять эту строку? Если id относится к типу SERIAL, BIGSERIAL или следует за определенным пользователем SEQUENCE, когда может возникнуть конфликт там, где вы хотите DO NOTHING?   -  person J Spratt    schedule 25.03.2019
comment
У меня есть некоторые данные, и эти данные будут обновляться каждый день. сегодня» — это поле моей таблицы, в это поле будет вставлена ​​текущая_дата, когда другие поля будут обновляться в соответствии с идентификатором (первичным ключом). мой идентификатор целочисленного типа.   -  person Prosenjit    schedule 25.03.2019
comment
CREATE TABLE public.my_company ( id integer NOT NULL DEFAULT nextval('my_company_id_seq'::regclass), переменный символ имени (50), время входа в систему без часового пояса, время выхода из системы без часового пояса, interval_time время без часового пояса, сегодняшняя дата DEFAULT CURRENT_DATE , ОГРАНИЧЕНИЕ my_company_pkey PRIMARY KEY (id))   -  person Prosenjit    schedule 25.03.2019
comment
Взгляните на этот SQLFiddle и дайте мне знать, если вы все еще думаете, что вам нужен RULE: sqlfiddle.com /#!17/073e9/16. Если я что-то не упустил, вы получите те же результаты, используя INSERT ... ON CONFLICT UPDATE. За исключением случаев, когда ваш RULE не работает из-за нарушения повторяющегося ключа.   -  person J Spratt    schedule 25.03.2019
comment
простите! Я использовал это раньше. Это не мой результат. Только current_date будет вставлен для входа или выхода из системы с определенным идентификатором при обновлении. Но в этом случае сначала вставляется current_date для каждой строки сегодня. Тем не менее мне нужно обновление ПРАВИЛО   -  person Prosenjit    schedule 26.03.2019
comment
одним словом, без обновления входа или выхода из системы current_date не будет вставлен в поле «сегодня». Поэтому мне нужно ПРАВИЛО. Могу ли я использовать любое условие в конфликте, такое как pastebin.com/He6U63L0   -  person Prosenjit    schedule 26.03.2019


Ответы (1)


Директива ON CONFLICT должна находиться в теле вашего правила:

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)
    ON CONFLICT (id) DO NOTHING

Хорошо, что директивы ON CONFLICT работают только тогда, когда целевая таблица имеет некоторые ограничения для отсрочки конфликта. В противном случае у вас будут ошибки времени выполнения, например:

No unique or exclusion constraint matching the ON CONFLICT specification.
person Leonel Sanches da Silva    schedule 06.11.2019