2016-09-16 17 views
0

親テーブルに子テーブルを持ち、親に複製を作成しない行があります。 documentationからPostgreSQL継承:子の行に親の行を挿入します

拡張例:

CREATE TABLE cities (
    idcity   serial PRIMARY KEY, 
    name   text, 
    population  float, 
    altitude  int  -- in feet 
); 

INSERT INTO cities VALUES (1, 'San Francisco', 7.24E+5, 63); 
INSERT INTO cities VALUES (2, 'Las Vegas', 2.583E+5, 2174); 
INSERT INTO cities VALUES (3, 'Mariposa', 1200, 1953); 
INSERT INTO cities VALUES (4, 'Sacramento', 3.694E+5, 30); 

-- The capitals table inherits from cities table. 
CREATE TABLE capitals (
    state   char(2) 
) INHERITS (cities); 

のは、私だけの首都であるので、私は私のcapitalsテーブルにそれをしたいサクラメントを学んだとしましょう。 普通のINSERT INTO capitalsを使用すると、都市で重複した価値が得られますが、これはあまり有用ではありません。

INSERT INTO capitals VALUES (4, 'Sacramento', 3.694E+5, 30, 'CA'); 

SELECT * FROM cities WHERE idcity = 4; 

idcity | name  | population | altitude 
-------+------------+------------+--------- 
4  | Sacramento | 369400  | 30 
4  | Sacramento | 369400  | 30 

(マニュアルに指定されているように、継承は主キーの重複する値を持つにつながると私はFROM ONLYでそれを避けることができますが、それは私の問題ではないのです。)

私は私が持っている可能性が推測capitalsのトリガーで子を挿入すると親行が削除されますが、それを行うための組み込みの方法はありませんか?

+1

いいえ、そこに継承ロジックが破られているためです。都市を首都にすることは、都市ではなくなることを意味しますか?しかし、あなたが本当にそれを達成する必要があるならば、引き金が行く方法です。 –

+0

@AlexeySoshin私は反対を意味します:都市(名前、人口、高度...)であることについて何も変えずに都市を首都にしたいです。どうすればいい? – Victor

+0

しかし、それはまったくトリガーなしであなたが今持っているものです。 –

答えて

1

あなたはselect * from citiesは基本的にUNION ALLであることを説明するプランから見ることができます:

select idcity from only cities 
union 
select idcity from capitals 

または使用:

explain 
select * 
from cities; 

Append (cost=0.00..21.27 rows=1027 width=4) 
    -> Seq Scan on cities (cost=0.00..2.07 rows=107 width=4) 
    -> Seq Scan on capitals (cost=0.00..19.20 rows=920 width=4) 

explain select idcity from only cities 
union all 
    select idcity from capitals 

Append (cost=0.00..21.27 rows=1027 width=4) 
    -> Seq Scan on cities (cost=0.00..2.07 rows=107 width=4) 
    -> Seq Scan on capitals (cost=0.00..19.20 rows=920 width=4) 

したがって、あなたのオプションは、いずれかのようになりますselect distinct * from citiesを、使用しています上記のコメントで議論したように、しかし、この特定のケースでは、トリガーは意味をなさないと結論づけました。

したがって、distinctを使用することを除いて、私がそれを達成するために見つけた方法はありません。

関連する問題