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