我正在嘗試構建我的第一個涉及繼承的Postgres數據庫模式。我知道PostgreSQL foreign key not existing, issue of inheritance?中討論的外鍵問題。然而,在這個問題的答案並沒有真正舉個例子的解決方案,因此我來到了我自己的(由http://people.planetpostgresql.org/dfetter/index.php?/archives/51-Partitioning-Is-Such-Sweet-Sorrow.html啓發):Postgres:繼承的性能和正確性 - 外鍵解決方法
CREATE TABLE a (
id SERIAL PRIMARY KEY INITIALLY DEFERRED,
foo TEXT
);
CREATE TABLE b (
PRIMARY KEY(id),
a_number REAL
) inherits(a);
CREATE TABLE c (
PRIMARY KEY(id),
a_number INTEGER
) inherits(a);
-- SELECT * FROM ONLY a; will always return an empty record.
CREATE TABLE x (
a_id INTEGER NOT NULL,
bar TEXT
);
CREATE TABLE xb (
FOREIGN KEY(a_id) REFERENCES b INITIALLY DEFERRED
) inherits(x);
CREATE TABLE xc (
FOREIGN KEY(a_id) REFERENCES c INITIALLY DEFERRED
) inherits(x);
爲了執行工作INSERT INTO x
我定義以下觸發:
CREATE FUNCTION marshal_x()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
DECLARE
ref_table varchar;
BEGIN
SELECT INTO ref_table p.relname FROM a, pg_class p WHERE a.id = NEW.a_id AND a.tableoid = p.oid;
IF ref_table = 'b'
THEN INSERT INTO xb (a_id, bar) VALUES (NEW.a_id, NEW.bar);
ELSIF ref_table = 'c'
THEN INSERT INTO xc (a_id, bar) VALUES (NEW.a_id, NEW.bar);
END IF;
RETURN NULL;
END;
$$;
CREATE TRIGGER insert_x_trg
BEFORE INSERT ON x
FOR EACH ROW
EXECUTE PROCEDURE marshal_x();
編輯:有沒有人看到這個定義的問題,這對我未受過訓練的眼睛並不明顯? 假設表c
爲空。會的
SELECT * FROM a JOIN x ON a.id= x.a_id;
的性能是一樣的
SELECT * FROM b JOIN x ON b.id= x.a_id;
?提前謝謝了。
isam