Я установил набор разделенных таблиц для документов на http://www.postgresql.org/docs/8.1/interactive/ddl-partitioning.html
CREATE TABLE t (year, a);
CREATE TABLE t_1980 ( CHECK (year = 1980) ) INHERITS (t);
CREATE TABLE t_1981 ( CHECK (year = 1981) ) INHERITS (t);
CREATE RULE t_ins_1980 AS ON INSERT TO t WHERE (year = 1980)
DO INSTEAD INSERT INTO t_1980 VALUES (NEW.year, NEW.a);
CREATE RULE t_ins_1981 AS ON INSERT TO t WHERE (year = 1981)
DO INSTEAD INSERT INTO t_1981 VALUES (NEW.year, NEW.a);
Насколько я понимаю, если я ВСТАВЛЯЮ В T (год, а) ЗНАЧЕНИЯ (1980, 5), он перейдет к t_1980, а если я ВСТАВЛЮ В t (год, а) ЗНАЧЕНИЯ (1981, 3), перейти к t_1981. Но мое понимание кажется неправильным. Во-первых, я не могу понять следующее из документов
"В настоящее время не существует простого способа указать, что строки не должны вставляться в основную таблицу. Ограничение CHECK (false) для основной таблицы будет наследоваться всеми дочерними таблицами, поэтому его нельзя использовать для этой цели. Одна возможность состоит в том, чтобы установить триггер ON INSERT в главной таблице, который всегда вызывает ошибку. (В качестве альтернативы такой триггер мог бы использоваться для перенаправления данных в соответствующую дочернюю таблицу вместо использования набора правил, как предложено выше. ) "
Означает ли вышеизложенное, что, несмотря на установку ограничений CHECK и ПРАВИЛ, мне также необходимо создать TRIGGER на главной таблице, чтобы вставки переходили в правильные таблицы? Если бы это было так, какой смысл поддерживать разделение БД? Я мог бы просто настроить отдельные таблицы? Я вставил несколько значений в основную таблицу, и эти строки все еще находятся в основной таблице, а не в унаследованных таблицах.
Второй вопрос. При извлечении строк следует ли выбирать из основной таблицы или мне нужно выбирать из отдельных таблиц по мере необходимости? Как будет работать следующее?
SELECT year, a FROM t WHERE year IN (1980, 1981);
Обновление: Похоже, я нашел ответ на свой вопрос
"Помните, что команда COPY игнорирует правила. Если вы используете COPY для вставки данных, вы должны скопировать данные в правильную дочернюю таблицу, а не в родительскую. COPY запускает триггеры, так что вы можете использовать ее, если вы создаете секционированные таблицы, используя триггерный подход. "
Я действительно использовал COPY FROM для загрузки данных, поэтому ПРАВИЛА игнорировались. Попробую с ТРИГГЕРАМИ.