У меня есть таблица базы данных 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 в свойство столбца по умолчанию?