我的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),其余的都会在另一个表中。
这是为什么?有没有办法可以阻止它?在插入之前设置触发器,所以我不明白为什么串行会增加两次。
重要吗?
提前致谢。
答案 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的值。