postgresql использовать вставку в обновлении CONFLICT для потока нет - PullRequest
1 голос
/ 19 марта 2020

могу ли я создать серийный номер, использовать конфликт вставки, не нужно 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

всегда get 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, будет конфликтовать

1 Ответ

0 голосов
/ 19 марта 2020

Если вы хотите увеличить 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

Демонстрация на DB Fiddle .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...