Последовательное увеличение значения Postgres на 2 - PullRequest
2 голосов
/ 18 февраля 2010

У меня есть несколько таблиц в моей базе данных 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, а затем выяснить, действительно ли данные должны идти в дочернюю таблицу или таблицу 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), а остальные будут в другой таблице.

Почему это? Есть ли способ, которым я могу остановить это? Триггер настроен ДО вставки, поэтому я не понимаю, почему последовательный будет увеличен в два раза.

Имеет ли это значение?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 18 февраля 2010

Даже если вы получите этот код, чтобы увеличить последовательность только на единицу, вы вообще не можете рассчитывать на отсутствие пробелов в столбце, инициализированном из последовательности: begin; insert into foo (...); abort оставит все последовательности увеличенными, даже если транзакция была прерванный.

A. Элейн Мустейн показывает , как создать последовательность без промежутков .

1 голос
/ 18 февраля 2010

Когда вы вставляете в дочернюю таблицу, вам нужно включить столбец parent_table_id, я думаю.

Прямо сейчас последовательность выдвигается один раз для родительской вставки, и значение из этого передаетсяВаша функция в НОВОМ.Затем вы выбрасываете это и просите систему сгенерировать новый при вставке в дочернюю таблицу (таблицы).

Поэтому попробуйте просто включить parent_table_id в список столбцов и вставить значение NEW.parent_table_id в нем.

...