2012-04-05 9 views
1

Ich habe eine Tabelle hinzu:eine neue Spalte in einer Postgres Partition Master Tabelle

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

, die auf date_key von Jahr aufgeteilt worden ist. Ich muss jetzt eine reading_id Spalte der Haupttabelle hinzufügen, um neue Funktionalität zu unterstützen, jedoch scheint die Verwendung der alter table Anweisung nicht korrekt zu funktionieren. Nach dem Anwenden der alter zum Hinzufügen der neuen reading_id Spalte alle insert into dw_readings Ergebnisse in reading_id wird auf null gesetzt, obwohl der Wert in der insert-Anweisung festgelegt ist; Dies kann über Java JDBC und über pgAdmin reproduziert werden. Jedoch funktionieren update Anweisungen, die die reading_id korrekt funktionieren lassen, den Spaltenwert festzulegen.

Die Tabelle geändert wird mit folgender Anweisung

ALTER dw_readings ADD COLUMN reading_id INTEGER; 

Was muss ich wissen, ist, wie man richtig eine neue Spalte in einer partitionierten Tabelle hinzuzufügen, so dass Einsätze richtig funktionieren.

+0

Zeigen Sie uns die 'ALTER' und INSERT-Anweisungen Sie verwenden. –

Antwort

1

Ich kann es nicht reproduzieren. Beachten Sie, dass, wenn Sie eine neue Spalte alle bereits vorhandenen Zeilen schaffen einen Nullwert in dieser Spalte haben:

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

ich das Problem im Code auf die Spur geführt. Das Problem hatte mit den Regelsätzen zu tun, die für die Partitionen erstellt wurden.

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

Diese Regel enthielt nicht die neue Spalte und würde daher immer null für die reading_id einfügen. Die Lösung bestand darin, der INSERT-Anweisung von DO INSTEAD reading_id hinzuzufügen.

0

Wie @xstrike erwähnt, sollte es ausreichen, die Regeln neu zu laden. Z. B, wenn Sie Rune auf Einsatz haben, müssen Sie es auf jeder Partition ersetzen:

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