Поведение нечетной последовательности postgres - PullRequest
1 голос
/ 10 ноября 2011

У меня есть таблица базы данных Postgres 9.04 с таблицей в ней под названием Versions:

CREATE TABLE tracking."Versions"
(
    "ObjectId"      UUID            NOT NULL,
    "From"          BIGINT          NOT NULL,
    "To"            BIGINT,
    "DataTypeId"    INTEGER         NOT NULL REFERENCES tracking."DataTypes" ( "DataTypeId" ),
    CONSTRAINT "Versions_pkey" PRIMARY KEY ("ObjectId", "DataTypeId")
);

В базе данных также определена последовательность, используемая столбцами From & To:

CREATE SEQUENCE tracking."dbVersion"
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 1;

Таблица версий фактически отслеживает изменения, внесенные в другие таблицы. Не вдаваясь в детали:

  • Когда строка создается в одной из этих других таблиц, строка добавляется в таблицу Версии, и предполагается, что для столбца От следует установить следующее значение последовательности.
  • Если существующая строка в одной из этих таблиц обновлена, для значения From соответствующей строки в таблице Versions должно быть установлено следующее значение последовательности.
  • При удалении строки в одной из этих других таблиц в столбце Кому должно быть установлено следующее значение последовательности.

Вместо того, чтобы установить значение по умолчанию для столбца From в значение "nextval ('tracking." DbVersion'), я реализовал хранимую функцию, которая возвращает результат вызова этой функции:

CREATE OR REPLACE FUNCTION tracking."NextVersion"() RETURNS BIGINT
AS $$
    SELECT nextval('tracking."dbVersion"'::regclass);
$$ LANGUAGE Sql;

Весь мой код для вставки строк в таблицы реализован в C # с использованием Entity Framework 4. Весь код C # работает нормально. Странно то, что когда я смотрю на данные в таблице «Версии», все значения в столбце «От» все четные. Когда я смотрю на свойства последовательности в PgAdmin, это странно. Но при следующей вставке строки сохраненное значение будет четным.

Что я делаю не так? Как Postgres всегда использует все значения, когда вы помещаете этот вызов nextval в свойство столбца по умолчанию?

1 Ответ

1 голос
/ 10 ноября 2011

Что ж, настало время почувствовать себя застенчивым.

Я просмотрел свой код C # для вставки строк в таблицу Versions и обнаружил, что на самом деле дважды вызывал хранимую процедуру NextVersion.Это объясняет, почему последовательность была всегда, даже когда она была записана в поле От.Я удалил второй вызов и проблема решена.

Тони

...