Что не так на моем запросе о вставке или обновлении Postgres - PullRequest
0 голосов
/ 05 июля 2018

Я хочу вставить или обновить данные в таблицу. Столбец «Группа» является УНИКАЛЬНЫМ, а идентификатор группы должен оставаться постоянным.

Есть скрипка: http://sqlfiddle.com/#!17/551ea/3

  • на вставке, все в порядке

  • также обновление работает для "Group" = 'TEST01'

Но когда я вставляю новую группу, а затем обновляю, идентификатор меняется (нажмите несколько раз «Запустить SQL»)

Это мой запрос на вставку:

INSERT INTO GROUPS ("GROUP", SERVER, PATH, SHARE)
VALUES ('TEST04', 4, 4, 4)
ON CONFLICT("GROUP") DO UPDATE
SET SERVER = 11,
    PATH = 11, 
    SHARE = 11
WHERE GROUPS."GROUP" = 'TEST01'

Идентификатор будет использоваться в других таблицах, его следует создавать только один раз для первой записи.

и это общая структура:

CREATE SEQUENCE gid START 1;
CREATE TABLE GROUPS (
  ID integer NOT NULL DEFAULT nextval('gid') PRIMARY KEY,
  "GROUP" VARCHAR NOT NULL UNIQUE,
  SERVER integer,
  PATH integer,
  SHARE integer
);

1 Ответ

0 голосов
/ 05 июля 2018

Посмотрите на это скрипка

Каждый раз, когда возникает конфликт при вставке - значение последовательности отбрасывается и ON UPDATE запрашивает новое значение. Итак, сначала вы начинаете с 1, затем вставляете 3 кортежа, чтобы конечное значение последовательности было 3. Затем вы пытаетесь вставить новый кортеж, но возникает конфликт - поэтому значение последовательности теперь равно 4. Затем вы пытаетесь вставьте новый кортеж - и он получит значение 5 для последовательности.

Если вы продолжите выполнять 2 вставки, последовательность продолжит увеличиваться. SQLfiddle, вероятно, использует постоянные соединения или некоторый пул соединений, который неправильно сбрасывает последовательность при перестроении схемы.

...