我建立了一套%的文檔分區表的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。