Postgres序列值递增2

时间:2010-02-17 22:03:14

标签: database postgresql triggers auto-increment increment

我的postgres数据库中有一些表,其中一些表相互继承。

例如:

CREATE TABLE parent_table(parent_table_id SERIAL PRIMARY KEY, 
       my_col1 VARCHAR(16) NOT NULL, 
       my_timestamp TIMESTAMP WITH TIME ZONE NOT NULL);
CREATE TABLE child_table() INHERITS (parent_table);
CREATE TABLE step_child_table() INHERITS (parent_table);

我有一个触发器,它允许我在parent_table上执行插入,然后确定数据是否应该真正进入child或step_child表。

例如:

CREATE OR REPLACE FUNCTION my_parent_trigger() RETURNS TRIGGER AS $$
BEGIN
  IF (NEW.my_col1 > 100) THEN
      INSERT INTO child_table(my_col1, my_timestamp) VALUES (NEW.my_col1, NEW.my_timestamp);
  ELSE
      INSERT INTO step_child_table(my_col1, my_timestamp) VALUES (NEW.my_col1, NEW.my_timestamp);
  END IF;
  RETURN NULL;
END;
$$
CREATE TRIGGER my_trigger BEFORE INSERT ON parent_table FOR EACH ROW EXECUTE PROCEDURE my_parent_trigger();

问题是我的索引递增2.如果我插入一些数据,我在parent_table上做一个select,我看到我的索引从2开始,然后转到4,6,8,10,...如果我在child_table上做一个select,我会看到我的索引(比如说2,8和10),其余的都会在另一个表中。

这是为什么?有没有办法可以阻止它?在插入之前设置触发器,所以我不明白为什么串行会增加两次。

重要吗?

提前致谢。

2 个答案:

答案 0 :(得分:2)

即使你得到这个代码只是将序列递增1,你也不能指望从序列初始化的列中没有间隙:begin; insert into foo (...); abort将使任何序列递增,即使交易中止。

一个。 Elein Mustain展示了how to create a gapless sequence

答案 1 :(得分:1)

当您插入子表时,我认为您需要包含parent_table_id列。

现在,对于父插入,序列会前进一次,并且该值的值将传递给NEW中的函数。然后将其丢弃,并在插入子表时让系统生成一个新的。

因此,请尝试在列表中包含parent_table_id,并在其中插入NEW.parent_table_id的值。