【问题标题】:Postgres serial value incrementing by 2Postgres 序列值递增 2
【发布时间】:2011-01-18 02:09:16
【问题描述】:

我的 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 上进行选择,我看到我的索引从 2 开始,然后转到 4、6、8、10、.. . 如果我对 child_table 进行选择,我会看到我的索引(比如 2、8 和 10),其余的将在另一个表中。

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

重要吗?

提前致谢。

【问题讨论】:

    标签: database postgresql triggers auto-increment increment


    【解决方案1】:

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

    现在,对于父插入,序列向前推进一次,然后将其中的值传递给您在 NEW 中的函数。然后你把它扔掉,并在你插入子表时让系统生成一个新的。

    所以尝试只在列列表中包含 parent_table_id,并在其中插入 NEW.parent_table_id 的值。

    【讨论】:

    • 这似乎解决了我的问题。我的插入现在看起来像“INSERT INTO child_table(parent_table_id, my_col1, my_timestamp) VALUES (NEW.my_parent_id, NEW.my_col1, NEW.my_timestamp); 它解决了我的问题,但这是合法的举动吗?我没有搞砸任何通过操作像这样的序列值来锁定或任何东西是我吗?
    • 没关系,因为子表使用与父表相同的顺序。
    • 不,这绝对是合法的举动。如果有的话,它比你最初做的“更合法”,因为默认触发孩子可以导致......嗯。有趣的东西。如果做得不对:-)
    【解决方案2】:

    即使您让此代码仅将序列递增 1,您通常也不能指望从序列初始化的列中没有间隙:begin; insert into foo (...); abort 将使任何序列递增,即使事务是中止。

    A. Elein Musttain 显示how to create a gapless sequence

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-15
      相关资源
      最近更新 更多