简体   繁体   English

postgresql 在 CONFLICT 更新上使用 insert 进行流 no

[英]postgresql use insert on CONFLICT update for flow no

can I generate serial number use insert conflict not need SEQUENCE ?使用插入冲突不需要序列号可以生成序列号吗?

this my table :这是我的桌子:

 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)       
)

but Sql is not OK: 1:但 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

is alway get 2总是得到 2

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

is not thread safe (ATOM): multiple query returning seq_no will conflict不是线程安全的 (ATOM):返回 seq_no 的多个查询会发生冲突

If you want to increment seq for each insert conflict, then you should not use the EXCLUDED pseudo-table, which refers the row proposed for insertion.如果您想为每个插入冲突增加seq ,那么您不应该使用EXCLUDED伪表,它引用建议插入的行。 Instead, use the table name:相反,使用表名:

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 . DB Fiddle 上的演示

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM