我建立了一套%的文档分区表的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 T(一年一)VALUES(1980,5),它会去t_1980,和如果我插入t(year,a)VALUES(1981,3),它将转到t_1981。但是,我的理解似乎是不正确的。首先,我无法理解文档中的以下内容
“目前还没有简单的方法来指定行不能插入主表中。主表上的CHECK(false)约束将被所有的子表,所以不能用于此目的,一种可能是在主表上设置一个总是引发错误的ON INSERT触发器(或者,这样的触发器可以用来将数据重定向到合适的子表,而不是使用上面建议的一组规则。)“
以上是否意味着尽管设置了CHECK约束和RULE,我还必须在主表上创建TRIGGER,以便INSERT去正确的表?如果是这样的话,db支持分区的要点是什么?我可以自己设置单独的表格吗?我在主表中插入了一堆值,这些行仍在主表中,而不在继承的表中。
第二个问题。当检索行时,是从主表中选择,还是必须根据需要从各个表中进行选择?以下工作如何?
SELECT year, a FROM t WHERE year IN (1980, 1981);
更新:好像我已经找到了答案,以我自己的问题
“请注意,COPY命令将忽略规则,如果你正在使用COPY中插入数据,你必须复制数据插入到正确的子表中而不是放入父项中COPY确实触发了触发器,因此如果使用触发器方法创建分区表,则可以正常使用它。
我的确在使用COPY FROM加载数据,所以RULEs被忽略。将尝试使用TRIGGER。