|
PostgreSQL 編18 - テーブルコピー、レコード追加、修正、削除、表切り捨て
■テーブルコピー
・問い合わせ結果で、新たにテーブルを作成することができる。
別テーブルへ移動するには、テーブルコピー後にオリジナルを delete、
新テーブルに整合性規則を追加するか、作成済みテーブルに insert で
select 追加すると良い。(下記のレコード追加も参照のこと。)
(表コピー)
create table workw as
select
*
from testm
where key like 'a%'
;
select * from workw;
key | data1 | data2 | data3
----------+-------+-------+-------
a001 | 1 | 2 | 3
a011 | 1 | 2 | 3
・集合問い合わせ結果で、新たにテーブルを作成することもできる。
create table work2w as
select
*
from testm
where key like 'a%'
union all
select
*
from testm
where key like 'a%'
;
select * from work2w;
key | data1 | data2 | data3
----------+-------+-------+-------
a001 | 1 | 2 | 3
a011 | 1 | 2 | 3
a001 | 1 | 2 | 3
a011 | 1 | 2 | 3
・空のテーブルをコピーしたい場合は、ありえないキーで抽出する。
create table work3w as
select
*
from testm
where key = '@'
;
select * from work3w;
key | data1 | data2 | data3
-----+-------+-------+-------
■レコード追加(レコード更新、インサート)
・テーブルやビューにレコードを追加する。
ビューについては、基本的に単純ビューでない一切の更新はできない。
insert into testm (
key,
data1,
data2,
data3
)
values (
'a001',
100,
200,
300
);
・追加データの並びがテーブル定義と同一であるなら、項目名を省略できる。
insert into testm values (
'a001',
100,
200,
300
);
・default が指定されていれば、省略で default 追加することができる。
但し、Oracle のようにデータ値として、default と書くことはできない。
(update でも default 指定が可能。)
create table test4m (
key char(8),
data1 int8,
data2 int8,
data3 int8 default 123
);
insert into test4m values (
'a001',
100,
200
);
select * from test4m;
key | data1 | data2 | data3
----------+-------+-------+-------
a001 | 100 | 200 | 123
・入力が必須でない項目は、省略して追加も可能である。
default 指定や not null 制約がない場合、NULL が割り当てられる。
insert into test4m values (
'a001',
100
);
select * from test4m;
key | data1 | data2 | data3
----------+-------+-------+-------
a001 | 100 | 200 | 123
a001 | 100 | | 123
・問い合わせ結果を別テーブルへレコード追加することも可能である。
別テーブルへレコード移動するには、別テーブルへレコード追加後にオリジ
ナルを delete すると良い。(上記のテーブルコピーも参照のこと。)
(副問い合わせ、レコードコピー)
insert into workw
select
key,
data1,
data2,
data3
from testm where key like 'a%'
;
・特定の項目を固定値にしたりもできる。
insert into workw
select
key,
data1,
data2,
111
from testm where key like 'a%'
;
・特定の項目だけをセットすることもできる。
insert into workw
select
key,
data2
from testm where key like 'a%'
;
・NULL を項目にセットすることもできる。
もちろん、not null 制約があれば、NULL をセットすることはできない。
insert into testm (
key,
data1,
data2,
data3
)
values (
'a001',
100,
200,
NULL
);
・データ中にシングルコーテーション「'」を含める場合は、「''」と 2 個
続けて書くと 1 個の「'」が文字として入る。
insert into testm (
key,
data1,
data2,
data3
)
values (
'a0''1',
100,
200,
300
);
■レコード修正(レコード更新、アップデート)
・テーブルやビューのレコードを修正する。
ビューについては、基本的に単純ビューでない一切の更新はできない。
where 句には select と同様に複雑な指定が可能である。
update testm set
data1 = 111,
data2 = 222,
data3 = 333
where key = 'a001'
;
・PostgerSQL では、データ値としての default が指定できないので、
insert は、省略することによって default 値で追加することができるが、
update では指定のしようがなかった。
update test4m set
data1 = 111,
data2 = 222,
data3 = default -- data3 = でもエラー
where key = 'a001'
;
・一項目だけの修正も可能である。
update testm set
data3 = 333
where key = 'a001'
;
・副問い合わせの結果を項目にセットすることもできる。
尚、update testm a set の別名指定はエラーとなる。
update testm set
data1 = 111,
data2 = (select count(*) from test2m b where b.code1 = testm.key),
data3 = 333
where key like 'a%'
;
・副問い合わせの結果を複数項目にセットすることは、PostgreSQL では、
できないようである。工夫してみたが構文エラーとなる。
update testm set
(data1, data2) = (select count(*), count(*) from test2m b where b.code1 = testm.key)
where key like 'a%'
;
・NULL を項目にセットすることもできる。
もちろん、not null 制約があれば、NULL をセットすることはできない。
update testm set
data1 = 111,
data2 = 222,
data3 = NULL
where key = 'a001'
;
■レコード削除(レコード更新、デリート)
・テーブルやビューのレコードを削除する。
ビューについては、基本的に単純ビューでない一切の更新はできない。
where 句には select と同様に複雑な指定が可能である。
delete from testm
where key = 'a001'
;
・この例では、testm の key の先頭が「a」で始まるレコードを全て削除して
いる。
delete from testm
where key like 'a%'
;
・この例では、testm の全レコードを削除している。
件数が多いとレスポンスに問題がある。
テーブルを空にするのが目的なら、表切り捨て truncate を使う方が高速で
現実的である。
delete from testm;
■トランザクション
・PostgreSQL のトランザクションは、標準は自動コミットとなっている。
ADO - ODBC では、cn.BeginTrans で手動コミットになる。
JDBC では、cn.setAutoCommit(false); でオートコミットを解除して、
手動コミットにする。
■排他制御(レコードロック)
・レコード追加、修正、削除では、レコードレベルの排他制御が働く。
デッドロック回避の考え方は、他のファイルシンテムと同様である。
テーブルロック(表ロック) として lock table もある。
・問い合わせで行ロックする方法として、for update 句がある。
for update nowait は、ロック解除を待たずにエラーを返す。
次の例は、ロックされていたら待って問い合わせる。
select * from testm where key = 'a001'
for update
;
・nowait はエラー構文となった。
select * from testm where key = 'a001'
for update nowait
;
■表切り捨て
・truncate は、表を切り捨ててクリアする。
(テーブル切り捨て、テーブルクリア、表クリア、テーブル内データ消去)
truncate table testm; |
|