SAK 図書館
SQL 基礎実地編 (その九) テーブルコピー、レコード追加、修正、削除
基本的に Oracle、SQL-Server、MDB で共通です。
■テーブルコピー
・問い合わせ結果で、新たにテーブルを作成することができる。
この例では、テストm のキーの先頭が「a」で始まるものだけを抽出して、
ワークw テーブルを自動生成している。
この場合、プライマリキーなどの整合性規則はコピーされない。
テーブル構造とレコードだけがコピーされる。
整合性規則がコピーされないのは、ワークテーブルの創成に都合が良い。
primary key の指定が必要な時は、後で、alter table で追加する。
別テーブルへ移動するには、テーブルコピー後にオリジナルを delete、
新テーブルに整合性規則を追加するか、作成済みテーブルに insert で
select 追加すると良い。(下記のレコード追加も参照のこと。)
(表コピー)
create table sak.ワークw as
select
*
from sak.テストm
where キー like 'a%'
;
・集合問い合わせ結果で、新たにテーブルを作成することもできる。
この例では、テスト1m とテスト2m のキーの先頭が「a」で始まるものだけ
を抽出して、ワークw テーブルを自動生成している。
create table sak.ワークw as
select
*
from sak.テスト1m
where キー like 'a%'
union all
select
*
from sak.テスト2m
where キー like 'a%'
;
・空のテーブルをコピーしたい場合は、ありえないキーで抽出する。
この例では、テストm のキーに「@」は存在しないとして、ゼロ件の抽出を
行い、結果として空のワークw テーブルを自動生成している。
create table sak.ワークw as
select
*
from sak.テストm
where キー = '@'
;
■レコード追加(レコード更新、インサート)
・テーブルやビューにレコードを追加する。
ビューについては、基本的に単純ビューでない一切の更新はできない。
この例では、テストm に 1 レコード追加している。
キーはユニーク指定してあるので、「a001」が既に存在するとエラーになる。
insert into sak.テストm (
キー,
データ1,
データ2,
データ3
)
values (
'a001',
100,
200,
300
);
・追加データの並びがテーブル定義と同一であるなら、項目名を省略できる。
insert into sak.テストm values (
'a001',
100,
200,
300
);
・データ2 の default が指定されていれば、default で追加することができ
る。(update でも default 指定が可能。)
insert into sak.テストm values (
'a001',
100,
default,
300
);
・入力が必須でない項目は、省略して追加も可能である。
この例では、データ1 とデータ2 のセットがない。
データ1 とデータ2 には NULL が割り当てられる。
insert into sak.テストm (
キー,
データ3
)
values (
'a001',
300
);
・問い合わせ結果を別テーブルへレコード追加することも可能である。
別テーブルへレコード移動するには、別テーブルへレコード追加後にオリジ
ナルを delete すると良い。(上記のテーブルコピーも参照のこと。)
この例では、テスト2m のキーが「a」で始まるレコードがテストm に追加
される。(副問い合わせ、レコードコピー)
insert into sak.テストm
select
キー,
データ1,
データ2,
データ3
from sak.テスト2m where キー like 'a%'
;
・特定の項目を固定値にしたりもできる。
insert into sak.テストm
select
キー,
データ1,
データ2,
111
from sak.テスト2m where キー like 'a%'
;
insert into sak.テストm
select
'a001',
10,
20,
30
from dual
;
・特定の項目だけをセットすることもできる。
insert into sak.テストm (キー, データ1)
select
'b002',
10
from dual
;
・NULL を項目にセットすることもできる。
もちろん、not null 制約があれば、NULL をセットすることはできない。
insert into sak.テストm (
キー,
データ1,
データ2,
データ3
)
values (
'a001',
100,
200,
NULL
);
・データ中にシングルコーテーション「'」を含める場合は、「''」と 2 個
続けて書くと 1 個の「'」が文字として入る。
insert into sak.テストm (
キー,
データ1,
データ2,
データ3
)
values (
'a0''1',
100,
200,
NULL
);
■レコード修正(レコード更新、アップデート)
・テーブルやビューのレコードを修正する。
ビューについては、基本的に単純ビューでない一切の更新はできない。
この例では、テストm のキーが「a001」のレコードを修正している。
where 句には select と同様に複雑な指定が可能である。
update sak.テストm set
データ1 = 111,
データ2 = 222,
データ3 = 333
where キー = 'a001'
;
・insert と同様に default として更新することができる。
update sak.テストm set
データ1 = 111,
データ2 = default,
データ3 = 333
where キー = 'a001'
;
・一項目だけの修正も可能である。
この例では、テストm のキーが「a001」のレコード中のデータ3 だけを修正
している。
update sak.テストm set
データ3 = 333
where キー = 'a001'
;
・この例では、テストm のキーの先頭が「a」で始まるレコード中のデータ3
を全て 333 に修正している。
update sak.テストm set
データ3 = 333
where キー like 'a%'
;
・この例では、テストm の全レコードのデータ3 を全て 333 に修正している。
update sak.テストm set
データ3 = 333
;
・副問い合わせの結果を項目にセットすることもできる。
この例では、あいうえおm の番号がキーと等しいデータをデータ2 にセット
している。(Oracle では使用できるが、mdb では使用できないので注意。)
update sak.テストm set
データ1 = 111,
データ2 = select データ from あいうえおm where 番号 = キー,
データ3 = 333
where キー like 'a%'
;
・副問い合わせの結果を複数項目にセットすることもできる。
select 文の組み合わせで、複雑な更新が可能である。
update sak.テストm set
(データ1, データ2, データ3) =
(
select データ1, データ2, データ3
from テスト2m
where テスト2m.キー = テストm.キー
)
where キー like 'a%'
;
・NULL を項目にセットすることもできる。
もちろん、not null 制約があれば、NULL をセットすることはできない。
update sak.テストm set
データ1 = 111,
データ2 = 222,
データ3 = NULL
where キー = 'a001'
;
■レコード削除(レコード更新、デリート)
・テーブルやビューのレコードを削除する。
ビューについては、基本的に単純ビューでない一切の更新はできない。
この例では、テストm のキーが「a001」のレコードを削除している。
where 句には select と同様に複雑な指定が可能である。
delete from sak.テストm
where キー = 'a001'
;
・この例では、テストm のキーの先頭が「a」で始まるレコードを全て削除し
ている。
delete from sak.テストm
where キー like 'a%'
;
・この例では、テストm の全レコードを削除している。
件数が多いとレスポンスに問題がある。
テーブルを空にするのが目的なら、表切り捨て truncate を使う方が高速で
現実的である。
delete from sak.テストm;
■トランザクション
・レコード追加、修正、削除では、トランザクション機能が働く。
トランザクションとは、複数のテーブルの複数の更新を一時的に行って、
まとめて、コミット(有効) にするか、ロールバック(無効) にするかできる。
Oracle の場合、コネクト直後、または、commit、roolback 直後から、
トランザクションが自動的に開始されている。
この例では、テストm とテスト2m ふたつのテーブルに複数の更新をかけて、
全て正常に更新できたので、トランザクションコミット(commit) して実際
の更新を有効にしている。
insert into sak.テストm values ('a001', 101, 201, 301);
insert into sak.テストm values ('b002', 102, 202, 302);
insert into sak.テストm values ('c003', 103, 203, 303);
insert into sak.テスト2m values ('d004', 111, 222, 333);
update sak.テスト2m set データ3 = 999 where キー = 'e005';
delete from sak.テスト2m where キー = 'f006';
commit;
・更新の途中でエラーが発生したり、間違った更新をしてしまった場合に、
全ての更新をなかった事にできる。
この例では、テストm とテスト2m ふたつのテーブルに複数の更新をかけて、
最後にトランザクションキャンセル(rollback) して実際の更新を無効にし
ている。トランザクションロールバックすると、それまでの更新命令は全て
取り消され、元の状態に戻る。
insert into sak.テストm values ('a001', 101, 201, 301);
insert into sak.テストm values ('b002', 102, 202, 302);
insert into sak.テストm values ('c003', 103, 203, 303);
insert into sak.テスト2m values ('d004', 111, 222, 333);
update sak.テスト2m set データ3 = 999 where キー = 'e005';
delete from sak.テスト2m where キー = 'f006';
rollback;
■排他制御(レコードロック)
・レコード追加、修正、削除では、レコードレベルの排他制御が働く。
デッドロック回避の考え方は、他のファイルシンテムと同様である。
テーブルロック(表ロック) として lock table もある。
・問い合わせで行ロックする方法として、for update 句がある。
for update nowait は、ロック解除を待たずにエラーを返す。
次の例は、ロックされていたら待って問い合わせる。
select * from sak.受注v1 where 受注番号 = '012345-001'
for update
;
・次の例は、ロックされていたらエラーを返す。
select * from sak.受注v1 where 受注番号 = '012345-001'
for update nowait
;
■表切り捨て
・truncate は、表を切り捨ててクリアする。(Access では使用不可)
(テーブル切り捨て、テーブルクリア、表クリア、テーブル内データ消去)
truncate table sak.受注m;
■SQL 基礎実地編資料
■SQL 基礎編資料
■SQL チューニング編資料
■Oracle PL/SQL 編資料
■PostgreSQL 編、JAVA Servlet、JSP 編資料
■MySQL 編資料