20040229

第7章 データの操作

7-1 行の追加
■表またはビューに行を追加する場合は、INSERT文を使用します。

■INSERT文の基本構文
INSERT INTO 表名 
  [(列名1 [, 列名2・・・])] VALUES (値1 [, 値2・・・]);
もしくは、
INSERT INTO 表名 
  [(列名1 [, 列名2・・・])] SELECT文;
  ・指定する順番は、表定義の際指定した順番である必要があります。
  ・全列に値を追加する場合には、表明の後ろの列名を省略することができます。
  ・列名を指定するときは、列名と値を正しく対応付けます。明確に指定しなかった場合は、NULL値が指定されたものと解釈します。
    →ただし、列に対してDEFAULT値が指定されたいるときは、DEFAULT値が入ります。


7-2 行の更新
■表またはビューの行を更新する場合は、UPDATE文を使用します。

■UPDATE文の基本構文
UPDATE 表名 
  SET 列名1 = 値[, 列名2 = 値]・・・・ 
    [WHERE 条件式];
  ・全行を更新する場合は、WHERE句を省略することができます。
  ・ビューを定義する問い合わせに次のいずれかの要素が含まれる場合は、そのビューは更新できません。
    (1)集合演算子
    (2)GROUP BY句
    (3)グループ関数
    (4)DISTINCT演算子


7-3 行の削除
■表またはビューの行を削除する場合は、DELETE文を使用します。

■DELETE文の基本構文
DELETE FROM 表名 
  [WHERE 条件式];
  ・全行を削除する場合は、WHERE句を省略することができます。
  ・ビューを定義する問い合わせに次のいずれかの要素が含まれる場合は、そのビューは削除できません。
    (1) 集合演算子
    (2) GROUP BY句
    (3)グループ関数
    (4) DISTINCT演算子
  ・TRUNCATE文を用いて、全行を削除することも出来ますが、DDLの為、実行後に暗黙のCOMMITも実行されます。
    →ROLLBACKコマンドを発行しても削除前の状態に戻すことは出来ない、トリガーが実行されない、といった違いが有ります。


7-4 行の追加、更新の選択
■表またはビューの行を条件で追加または更新をする場合は、MERGE文を使用します。

■MERGE文の基本構文
MERGE INTO 表名 別名 
  USING
表名 別名 
  ON
( 結合条件 )
 WHEN MATCHED THEN 
    UPDATE SET 列名1 = 値1, 列名2 = 値2, ・・・
 WHEN NOT MATCHED THEN 
    INSERT [( 列名1, 列名2 , ・・・ )]
     VALUES ( 値1, 値2, ・・・ )
  ・INTO句で指定した表とUSING句で指定した表を、ON句の条件に一致するかどうかを判断し、
    一致する行→INTO句の表の行をUSING句の表の行の値で上書き
    一致しない行→INTO句の表にUSING句の表の行の値を挿入
  ・ビューを定義する問い合わせに次のいずれかの要素が含まれる場合は、そのビューは削除できません。
    (1) 集合演算子
    (2) GROUP BY句
    (3)グループ関数
    (4) DISTINCT演算子


7-5 WITH CHECK OPTION
■INSERT、UPDATE、DELETE文の中で表の変わりに副問合せを使用した場合に、副問合せのWHERE句に違反する行を生成させない
SQL句
INSERT INSERT INTO view1( 
SELECT empno, ename, deptno FROM emp 
WHERE deptno = 10
WITH CHECK OPTION) 
VALUES (1010, 'JONY',20);
→エラー
UPDATE UPDATE( 
SELECT empno, ename, deptno FROM emp 
WHERE deptno = 10
WITH CHECK OPTION) 
SET deptno = 20 
FROM view1;
→エラー
DELETE DELETE句の場合はWHERE句に存在しない行は元々存在しないので、エラーになりません。


7-6 トランザクション
■Oracleではトランザクション単位でデータの整合性を維持しています。
■COMMITの基本構文 
COMMIT [WORK]; 
  ・データベースに対してCOMMITを発行すると、該当するトランザクションが確定します。
  ・該当トランザクションによって変更された結果を、他のセッションから見ることが出来るようになります。
  ・該当トランザクションが取得したロックがすべて解除されます。

■ROLLBACKの基本構文
ROLLBACK [WORK];
  ・データベースに対してROLLBACKを発行すると、該当トランザクションによって実行された処理が、すべて取り消されます。 
  ・該当トランザクションが取得していたロックがすべて解除されます。 

■SAVEPOINTの基本構文
SAVEPOINT セーブポイント名;
もしくは
ROLLBACK [WORK] 
  TO SAVEPOINT セーブポイント名; 
  ・SAVEPOINTコマンドを使用すれば、該当するトランザクションの一部だけを取り消すことが出来ます。
    →該当するセーブポイントより後のセーブポイントは失われますが、該当するセーブポイント及び前のセーブポイントは残ります。 
  ・該当するセーブポイントより後で実行された処理が、全て取り消されます。  
  ・該当するセーブポイントより後のSQL文で取得したロックとリソースが、すべて開放されます。