1

私はテーブルを持っています:

dw_readings(date_key, time_key, account_key, reading_value, consumption, processed_date) 

これは年ごとに分割さdate_keyれています。reading_id新しい機能をサポートするためにマスターテーブルに列を追加する必要がありますが、alter tableステートメントの使用は正しく機能していないようです。を適用して新しい列alterを追加すると、ステートメントに値が設定されているにもかかわらず、に設定されます。これは、JavaJDBCおよびpgAdminを介して再現できます。ただし、ステートメントを正しく設定すると、列の値を設定できます。reading_idinsert into dw_readingsreading_idnullinsertupdatereading_id

テーブルは次のステートメントを使用して変更されています

ALTER dw_readings ADD COLUMN reading_id INTEGER;

私が知る必要があるのは、挿入が正しく機能するように、パーティション化されたテーブルに新しい列を適切に追加する方法です。

4

3 に答える 3

2

コード内の問題を追跡することができました。問題は、パーティション用に作成されたルール セットに関係していました。

    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);

このルールには新しい列が含まれていなかったため、reading_id には常に null が挿入されていました。解決策は、DO INSTEAD の INSERT ステートメントに reading_id を追加することでした。

于 2012-04-20T11:40:49.183 に答える
1

再現できません。新しい列を作成すると、既存のすべての行の列にnull値が含まれることに注意してください。

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)
于 2012-04-05T12:58:17.840 に答える
0

@xstrike が述べたように、ルールをリロードするだけで十分です。たとえば、挿入時にルーンがある場合は、各パーティションでそれを置き換える必要があります。

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.*)
);
于 2016-08-31T20:09:42.937 に答える