テーブルに関するTips
一時テーブル,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(...);

