問題: Postgresql では、テーブルtemp_person_two
が から継承されている場合、親テーブルが変更さtemp_person
れると、子テーブルのデフォルトの列値が無視されます。
複製方法:
まず、テーブルと子テーブルを作成します。子テーブルには、デフォルト値を持つ 1 つの列が必要です。
CREATE TEMPORARY TABLE temp_person (
person_id SERIAL,
name VARCHAR
);
CREATE TEMPORARY TABLE temp_person_two (
has_default character varying(4) DEFAULT 'en'::character varying NOT NULL
) INHERITS (temp_person);
次に、データを子テーブルにコピーするトリガーを親テーブルに作成します (これは悪い設計のように見えますが、これは問題を示すための最小限のテスト ケースです)。
CREATE FUNCTION temp_person_insert() RETURNS trigger
LANGUAGE plpgsql
AS '
BEGIN
INSERT INTO temp_person_two VALUES ( NEW.* );
RETURN NULL;
END;
';
CREATE TRIGGER temp_person_insert_trigger
BEFORE INSERT ON temp_person
FOR EACH ROW
EXECUTE PROCEDURE temp_person_insert();
次に、データを親に挿入し、子からデータを選択します。データは正しいはずです。
INSERT INTO temp_person (name) VALUES ('ovid');
SELECT * FROM temp_person_two;
person_id | name | has_default
-----------+------+-------------
1 | ovid | en
(1 row )
最後に、関連のない新しい列を追加して、親テーブルを変更します。データを挿入しようとして、「not-null 制約」違反が発生するのを確認します。
ALTER TABLE temp_person ADD column foo text;
INSERT INTO temp_person(name) VALUES ('Corinna');
ERROR: null value in column "has_default" violates not-null constraint
CONTEXT: SQL statement "INSERT INTO temp_person_two VALUES ( $1 .* )"
PL/pgSQL function "temp_person_insert" line 2 at SQL statement
私のバージョン:
testing=# select version();
version
-------------------------------------------------------------------------------------------------------
PostgreSQL 8.4.17 on x86_64-pc-linux-gnu, compiled by GCC gcc-4.4.real (Debian 4.4.5-8) 4.4.5, 64-bit
(1 row)