ファイヤープロジェクト
テーブルに関するTips
2003-12-29T15:50+09:00   matsu
一時テーブル,SELECT文の結果からテーブルを作成,既存テーブルの属性変更などをしてみた.
特に指定せずにCREATE TABLEすると,永続テーブルが作成される.永続テーブルはDROPするまで消えない.時にはセッション内でのみ有効な一時テーブルを作成できると便利である.これにはCREATE TEMP TABLEを使用する.
CREATE TEMP TABLE テーブル名(......)
実際にやってみた.
benchmark=> CREATE TEMP TABLE temp1(
benchmark(> k INTEGER PRIMARY KEY);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index 'temp1_pkey' for table 'temp1'
CREATE

benchmark=> \d temp1
Did not find any relation named "temp1".

benchmark=> SELECT * FROM temp1;
 k 
---
(0 rows)
一時テーブルでも主キーなどを指定すればインデクスが作成されるようだ.また,\dや\zでは一時ファイルは見えないらしい.別セッションで作成した一時テーブルtemp1を調べてみた.
benchmark=> SELECT * FROM temp1;
ERROR:  Relation "temp1" does not exist
作成したセッション内でないと見えない.作成したセッションを閉じれば消えるらしいが,そうせずにDROPすることもできるようだ.
benchmark=> DROP TABLE temp1;
一時テーブルには,既存の永続テーブルと重複する名前を指定することができる.重複する名前が指定された場合は一時テーブルを指すものとして扱われる.
SELECT文の結果からテーブルを作成することができる.
CREATE TABLE テーブル名 AS SELECT文
ただし制約やデフォルト値は引き継がれない.今回はTEMPと組み合わせて使用してみた.
benchmark=> CREATE TEMP TABLE temp2 AS
benchmark-> SELECT *
benchmark-> FROM result_linpack 
benchmark-> WHERE cluster_id = 3;
SELECT
benchmark=> SELECT * FROM temp2;
   n   | nb  | cluster_id | gflops  | exec_date 
-------+-----+------------+---------+-----------
 10000 | 120 |          3 | 106.223 | 
 11000 | 120 |          3 | 104.827 | 
 12000 | 120 |          3 | 105.196 | 
 13000 | 120 |          3 | 105.402 | 
 14000 | 120 |          3 | 105.725 | 
 15000 | 120 |          3 | 106.069 | 
 16000 | 120 |          3 | 106.208 | 
 17000 | 120 |          3 | 106.477 | 
 18000 | 120 |          3 | 106.782 | 
 19000 | 120 |          3 | 106.923 | 
 20000 | 120 |          3 |  107.17 | 
 20000 |  20 |          3 | 103.912 | 
 20000 |  40 |          3 | 105.878 | 
 20000 |  80 |          3 | 106.557 | 
 20000 | 160 |          3 | 107.262 | 
 20000 | 200 |          3 | 107.253 | 
 20000 | 280 |          3 | 107.053 | 
 20000 | 320 |          3 | 106.991 | 
(18 rows)
既存のテーブルの属性変更にはALTER TABLEを使用する.
テーブル名の変更
ALTER TABLE テーブル名 RENAME to 新テーブル名;
列の追加
ALTER TABLE テーブル名 ADD COLUMN 列名 型...;
列名の変更
ALTER TABLE テーブル名 RENAME COLUMN 列名 TO 新列名;
デフォルト値の設定
ALTER TABLE テーブル名 ALTER COLUMN 列名 SET DEFAULT 値;
デフォルト値の設定削除
ALTER TABLE テーブル名 ALTER COLUMN 列名 DROP DEFAULT;
テーブルのオーナー変更
ALTER TABLE テーブル名 OWNER TO ユーザ名;
制約の追加
ALTER TABLE テーブル名 ADD CONSTRAINT 制約名 CHECK(...);
PostgreSQLでは列や制約は削除できないようなので,CREATE TABLE ASや\copyなどを駆使してテーブルを作り直すことで対処する.
matsu(C)
Since 2002
Mail to matsu