【问题标题】:postgresql use insert on CONFLICT update for flow nopostgresql 在 CONFLICT 更新上使用插入以获取流号
【发布时间】:2020-03-19 00:59:10
【问题描述】:

我可以使用插入冲突而不需要 SEQUENCE 生成序列号吗?

这是我的桌子:

 CREATE TABLE web.flow_no
(
    apply_kind character varying(15) COLLATE pg_catalog."default" NOT NULL,
    seq_name character varying(10) COLLATE pg_catalog."default" NOT NULL,
    seq_no numeric(8,0) NOT NULL DEFAULT 1,
    CONSTRAINT flow_no_pk PRIMARY KEY (apply_kind, seq_name)       
)

但是 Sql 不行: 1:

insert into web.flow_no(apply_kind,seq_name)values('ISO_FILE','202003')
ON CONFLICT(apply_kind, seq_name)
DO UPDATE SET seq_no=EXCLUDED.seq_no+1
 RETURNING seq_no

总是得到 2

2:

insert into web.flow_no(apply_kind,seq_name)values('ISO_FILE','202003')
ON CONFLICT(apply_kind, seq_name)
DO UPDATE SET seq_no=
(select seq_no from  web.flow_no where apply_kind=EXCLUDED.apply_kind and 
 seq_name=EXCLUDED.seq_name)+1
 RETURNING seq_no

不是线程安全的 (ATOM):返回 seq_no 的多个查询会发生冲突

【问题讨论】:

    标签: sql postgresql sql-update sql-insert


    【解决方案1】:

    如果你想为每个插入冲突增加seq,那么你不应该使用EXCLUDED 伪表,它指的是建议插入的行。而是使用表名:

    INSERT INTO web.flow_no(apply_kind,seq_name)values('ISO_FILE','202003')
    ON CONFLICT(apply_kind, seq_name)
    DO UPDATE SET seq_no = flow_no.seq_no + 1
    RETURNING seq_no
    

    Demo on DB Fiddle.

    【讨论】:

      猜你喜欢
      • 2020-09-10
      • 1970-01-01
      • 2023-04-02
      • 2014-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      相关资源
      最近更新 更多