奇怪的postgres序列行为

时间:2011-11-10 00:33:07

标签: postgresql stored-procedures entity-framework-4 sequence

我有一个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&和到列:

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

Versions表实际上是跟踪对其他表所做的更改。没有详细说明:

  • 当在其中一个表中创建一行时,会在Versions表中添加一行,并且From列应该设置为序列的下一个值。
  • 如果更新其中一个表中的现有行,则必须将Versions表中相应行的From值设置为序列的下一个值。
  • 当删除其中一个表中的行时,必须将To列设置为序列的下一个值。

我没有将From列的Default值设置为“nextval('tracking。”dbVersion'),而是实现了一个存储函数,它返回调用此函数的结果:

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

所有用于在表中插入行的代码都是使用Entity Framework 4在C#中实现的。所有C#代码都运行正常。奇怪的是,当我查看Versions表中的数据时,From列中的值都是偶数。当我在PgAdmin中查看序列的属性时,它很奇怪。但是下次插入一行时,存储的值是偶数。

我做错了什么?当您将nextval调用放在列的默认属性中时,Postgres如何始终使用所有值?

1 个答案:

答案 0 :(得分:1)

好吧,是时候让我感到羞怯。

我查看了我的C#代码,用于将行插入到Versions表&我发现我实际上是两次调用NextVersion存储过程。这就解释了为什么序列始终是在写入From字段时。我删除了第二个电话&问题解决了。