Что не так с моим запросом на вставку или обновление Postgres

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

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

  • на вставке все нормально

  • также обновление работает для "Группы" = "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
);

person bear7    schedule 05.07.2018    source источник
comment
Я думаю, что это проблема SQLFiddle, а не проблема с вашим SQL. Запустите свой скрипт с помощью обычного SQL-клиента в базе данных, которой нет в Интернете. Код в порядке и будет работать правильно.   -  person a_horse_with_no_name    schedule 05.07.2018


Ответы (1)


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

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

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

person IVO GELOV    schedule 05.07.2018