Postgresql 向Postgres分区主表添加新列

Postgresql 向Postgres分区主表添加新列,postgresql,partitioning,Postgresql,Partitioning,我有一张桌子: dw_readings(date_key, time_key, account_key, reading_value, consumption, processed_date) 已按年份在日期进行分区。我现在需要在主表中添加一个reading\u id列来支持新功能,但是使用alter table语句似乎无法正常工作。应用alter添加新的reading\u id列后,任何insert到dw\u readings都会导致reading\u id设置为null,尽管insert

我有一张桌子:

dw_readings(date_key, time_key, account_key, reading_value, consumption, processed_date) 
已按年份在日期进行分区。我现在需要在主表中添加一个
reading\u id
列来支持新功能,但是使用
alter table
语句似乎无法正常工作。应用
alter
添加新的
reading\u id
列后,任何
insert到dw\u readings
都会导致
reading\u id
设置为
null
,尽管
insert
语句中设置了值;这可以通过JavaJDBC和pgAdmin进行复制。但是
update
语句设置
reading\u id
工作正常,允许我设置列值

正在使用以下语句更改该表

ALTER dw_readings ADD COLUMN reading_id INTEGER;

我需要知道的是如何正确地将新列添加到分区表中,以便INSERT正常工作。

我无法复制它。请注意,创建新列时,所有预先存在的行在该列中将具有空值:

create table dw_readings(date_key date);
create table dw_readings_2012(
    check (extract(year from date_key) = 2012)
)   inherits(dw_readings);
;
insert into dw_readings_2012 (date_key) values ('2012-01-01'::date);
alter table dw_readings add column reading_id integer;
insert into dw_readings_2012 (date_key, reading_id) values ('2012-01-02'::date, 2);
select *
from dw_readings
;
  date_key  | reading_id 
------------+------------
 2012-01-01 |           
 2012-01-02 |          2
(2 rows)

我设法在代码中找到了这个问题。问题与为分区创建的规则集有关

    CREATE OR REPLACE RULE dw_readings_insert_y2009 AS
       ON INSERT TO dw_readings
       WHERE new.date_key >= 20090101 AND new.date_key < 20100101
       DO INSTEAD 
    INSERT INTO dw_readings_y2009 (date_key, time_key, account_key, reading_value, consumption, processed_date) 
      VALUES (new.date_key, new.time_key, new.account_key, new.reading_value, new.consumption, new.processed_date);
创建或替换规则dw\u读数\u插入\u y2009作为
插入到dw_读数上
其中new.date_key>=20090101和new.date_key<20100101
取而代之
插入dw_读数y2009(日期、时间、账户、读数、消耗、处理日期)
值(new.date\u key、new.time\u key、new.account\u key、new.reading\u value、new.consumpion、new.processed\u date);

此规则不包括新列,因此将始终为reading_id插入null。解决方案是将reading_id添加到DO的insert语句中。

正如@xstrike所述,重新加载规则就足够了。 例如,如果您在insert上有符文,则必须在每个分区上替换它:

CREATE OR REPLACE RULE table_partition_201608_rule
AS ON INSERT TO table_master WHERE date BETWEEN '2016-08-01 00:00:00.000' AND '2016-08-31 23:59:59.999'
DO INSTEAD (
  INSERT INTO table_partition_201608 VALUES (NEW.*)
);

向我们展示你正在使用的
ALTER
和INSERT语句。找出地下城和龙参考:D