トップ 差分 一覧 Farm ソース 検索 ヘルプ RSS ログイン

PostgreSQL【継承】

PostgreSQL

[PostgreSQL]
最終更新時間:2010年09月28日 07時11分58秒

継承

 テーブル定義

親テーブル作成
 sample=# create table parent (
 sample(#   id serial,
 sample(#   name text
 sample(# );
子テーブル作成
 sample=# create table child (
 sample(#   date timestamp
 sample(# ) inherits (parent);
確認

きちんと継承されている

 sample=# \d parent
                          Table "public.parent"
  Column |  Type   |                      Modifiers                      
 --------+---------+-----------------------------------------------------
  id     | integer | not null default nextval('parent_id_seq'::regclass)
  name   | text    | 
 sample=# \d child
                                     Table "public.child"
  Column |            Type             |                      Modifiers                      
 --------+-----------------------------+-----------------------------------------------------
  id     | integer                     | not null default nextval('parent_id_seq'::regclass)
  name   | text                        | 
  date   | timestamp without time zone | 
 Inherits: parent
テーブル継承
 create table [子テーブル名] (
   子テーブルで追加したい項目
 ) inherits ([親テーブル名]);

 データ挿入

親・子テーブルデータ挿入
 sample=# insert into parent (name) values ('hoge');
 INSERT 0 1
 sample=# insert into parent (name) values ('fuga');
 INSERT 0 1
 sample=# insert into child (name, date) values ('foo', now());
 INSERT 0 1
 sample=# insert into child (name, date) values ('var', '2010-09-27 00:00:00');
 INSERT 0 1
確認

parentテーブルをselectするとchildテーブルの値も参照されて出力される

 sample=# select * from parent;
  id | name 
 ----+------
   1 | hoge
   2 | fuga
   3 | foo
   4 | var
 (4 rows)

childテーブルをselectしてもparentテーブルの値は出力されない

 sample=# select * from child;
  id | name |            date            
 ----+------+----------------------------
   3 | foo  | 2010-09-27 21:54:56.955691
   4 | var  | 2010-09-27 00:00:00
 (2 rows)

※注目したいのがparentテーブルのidはserial型で作成したが、それがchildテーブルに継承され、さらに値までもparentテーブルから引きついでいること。

ここで再度parentテーブルにデータを挿入すると

 sample=# insert into parent (name) values ('fizz');
 INSERT 0 1
 sample=# select * from parent;
  id | name 
 ----+------
   1 | hoge
   2 | fuga
   5 | fizz
   3 | foo
   4 | var
 (5 rows)

やはり値が5から始まるようになるが、出力はparentテーブルが先になるため5は上に出力される。

親テーブルのみの参照

ONLYをつけると親テーブルのみを参照するようになる

 sample=# select * from only parent;
  id | name 
 ----+------
   1 | hoge
   2 | fuga
   5 | fizz
 (3 rows)

 データ更新

親テーブルをselectしたときは子テーブルも出力されていた。
それと同じで親テーブルをupdateすると、子テーブルも一緒にupdateされるときがある。

親テーブルデータ更新

idが2で割り切れるもののnameカラムの値を"fugafuga"に変更する

 sample=# UPDATE parent set name='fugafuga' where id%2=0;
 UPDATE 2
確認

parentテーブルのid:2とchildテーブルのid:4が検索条件にかかりnameが更新される

 sample=# select * from parent;
  id |   name   
 ----+----------
   1 | hoge
   5 | fizz
   2 | fugafuga
   3 | foo
   4 | fugafuga
 (5 rows)

 データ削除

削除も同じようになる

親テーブルデータ削除

 sample=# delete from parent where id%2 = 0;
 DELETE 2
確認

2で割り切れるもののデータを削除する

 sample=# select * from parent;
  id | name 
 ----+------
   1 | hoge
   5 | fizz
   3 | foo
 (3 rows)

参照

http://www.fireproject.jp/feature/postgresql/sql-intro/inherits.html