Я создал набор секционированных таблиц в Документы на 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);
В моем понимании, если я INSERT INTO т (год, а) VALUES (1980, 5), он будет идти к t_1980, и если я ВСТАВЯТСЯ в t (год, a) ЗНАЧЕНИЯ (1981, 3), он перейдет к t_1981. Но мое понимание кажется неправильным. Во-первых, я не могу понять следующее из документов.
«В настоящее время нет простого способа указать, что строки не должны вставляться в основную таблицу. Ограничение CHECK (false) в главной таблице наследуется все дочерние таблицы, поэтому их нельзя использовать для этой цели. Одна из возможностей заключается в настройке триггера ON INSERT в главной таблице, который всегда вызывает ошибку. (В качестве альтернативы такой триггер может использоваться для перенаправления данных в правильный дочерний таблицу, вместо того, чтобы использовать набор правил, как было предложено выше.) «
Означает ли это, что, несмотря на установление ограничений CHECK и ПРАВИЛ, мне также необходимо создать TRIGGERs на главной таблице, чтобы INSERT перейдите к правильным таблицам? Если бы это было так, то какой смысл поддерживать разделение db? Я мог бы просто настроить отдельные таблицы самостоятельно? Я вставил кучу значений в главную таблицу, и эти строки все еще находятся в главной таблице, а не в унаследованных таблицах.
Второй вопрос. При извлечении строк я могу выбрать из главной таблицы или мне нужно выбрать из отдельных таблиц по мере необходимости? Как будет работать следующая работа?
SELECT year, a FROM t WHERE year IN (1980, 1981);
Update:. Кажется, я нашел ответ на мой собственный вопрос
«Имейте в виду, что команда COPY игнорирует правила Если вы используете COPY для вставки данных, необходимо скопировать данные в правильную дочернюю таблицу, а не в родительскую. COPY запускает триггеры, поэтому вы можете использовать ее, как правило, при создании секционированных таблиц с использованием триггерного подхода ».
Я действительно использовал COPY FROM для загрузки данных, поэтому ПРАВИЛА игнорировались. Попробуй с TRIGGER.