psycopg2.NotSupportedError:带有ON CONFLICT子句的INSERT不能与具有INSERT或UPDATE规则的表一起使用

问题描述 投票:1回答:1

当我在CONFLICT子句旁边创建更新RULE时,将抛出该错误。

这里是我的冲突代码

 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,名称,登录名。注销,interval_time,今天。

如果有任何数据更新,则将那些数据插入同一表中。但是在这里我不能同时使用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) 
);
database postgresql rules insert-update
1个回答
0
投票

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.
© www.soinside.com 2019 - 2024. All rights reserved.