首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CDC插入postgres语句

CDC插入postgres语句
EN

Stack Overflow用户
提问于 2022-03-25 14:42:29
回答 1查看 86关注 0票数 0

我正在尝试实现一个语句,在插入新行之前,我在其中更新一些时间戳和一个活动字段。如果信息是相同的,它不应该做任何事情。

我的声明如下:

代码语言:javascript
复制
with inputdata (id, name, inPrison)
as (
    SELECT * FROM (
        VALUES (
            1, 'egon',TRUE), (2, 'benny',FALSE), (3, 'kjeld',FALSE)) AS t (id,name,inPrison)
)
INSERT INTO public.cdc_test
           (id, NAME, inPrison,validfrom,validto,valid)
SELECT inputdata.id, inputdata.NAME, inputdata.inPrison, cdc.start, cdc.end, cdc.active
FROM inputdata 
cross JOIN (select now() as start, make_timestamptz(9999, 12, 31, 8, 00, 00) as end, TRUE as active) cdc
ON CONFLICT (id) WHERE md5(row(id,name)::text) != md5(row(public.cdc_test.id,public.cdc_test.name)::text)
DO UPDATE 
  SET valid = FALSE, 
      validto = excluded.validfrom 
      where active = TRUE

public.cdc_test表定义为:

代码语言:javascript
复制
CREATE TABLE public.cdc_test (
   id int NOT NULL,
   name char(100),
   inPrison BOOLEAN,
   validfrom DATE,
   validto DATE,
   valid BOOLEAN
);

我可以在没有开始冲突的情况下运行我的声明,但是持续的冲突不断给我带来麻烦,我觉得我已经用尽了我必须要做这件事的想法。

有人能看出我做错了什么吗?当我运行它时,我得到以下错误:invalid reference to FROM-clause entry for table "cdc_test"

EN

回答 1

Stack Overflow用户

发布于 2022-03-25 14:51:49

您的ON CONFLICT应该在WHERE子句之后,而WHERE子句是SELECT语句的关联,而不是冲突处理。

在这里,您的冲突处理基于id列(可能是该表的主键)。

如果希望能够在md5(row(id,name)::text)上处理md5(row(id,name)::text),则需要在md5(row(id,name)::text)上创建UNIQUE INDEX并在ON CONFLICT (md5(row(id,name)::text))上使用该表达式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71618800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档