問題:在PostgreSQL,如果從temp_person
表temp_person_two
繼承,子表上默認的列值被忽略,如果父表被改變。改變父表在PostgreSQL 8.4中斷子表默認
如何複製:
首先,創建表和子表。子表應該有一列具有默認值。
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)
最後,通過添加一個新的無關列來更改父表。嘗試插入數據和觀看「非空約束」衝突發生:
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)
9.2中的相同行爲。 –