UPDATE
UPDATE文は、表のすべての行または検索条件を満たす行の1つ以上の列値を更新します。
必要な権限
表の所有者に必要な権限はありません。
別のユーザーの表の場合、UPDATEが必要です。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
UPDATE [hint] [FIRST NumRows] {[Owner.]TableName [CorrelationName]} SET {ColumnName = {Expression1 | NULL | DEFAULT}} [,...] [ WHERE SearchCondition ] RETURNING|RETURN Expression2[,...] INTO DataItem[,...]
パラメータ
| パラメータ | 説明 |
|---|---|
|
|
|
|
|
更新する行の数を指定します。 |
|
|
単一の文のすべての相関名は、一意である必要があります。 |
|
|
|
|
|
集計関数を含まない式。式は、更新操作に指定した行ごとに評価されます。式のデータ型は、更新する列のデータ型と互換性がある必要があります。値を更新する場合、 |
|
|
|
|
|
列をデフォルト値で更新する必要があることを指定します。 |
|
|
検索条件には副問合せを含めることができます。検索条件がTRUEとなる行はすべて、 |
|
|
有効な式の構文。詳細は、「式」を参照してください。 |
|
|
取得した |
説明
-
TimesTen Scaleoutでは、分散キー列は、列を同じ値に更新する以外の更新はできません。
-
主キー列は、列を元の値に更新する以外の更新はできません。
-
WHERE句を省略した場合、表のすべての行はSET句の指定に従って更新されます。 -
UPDATE操作中に文字またはバイナリ文字列が切り捨てられた場合、TimesTenによって警告が生成されます。 -
制約違反(
UNIQUE、FOREIGNKEY、NOTNULL)が発生すると、UPDATE文は失敗します。 -
外部キー制約に違反する
UPDATE操作はエラーになります。外部キー制約の詳細は、「CREATE TABLE」を参照してください。 -
RETURNING句の制限:-
各
Expression2は単純な式である必要があります。集計関数はサポートされません。 -
順序番号は
OUTパラメータに戻せません。 -
ROWNUMおよび副問合せは、RETURNING句では使用できません。 -
RETURNING句に使用されているパラメータは、UPDATE文で重複して使用できません。 -
RETURNING句を使用して複数行を戻すには、PL/SQLBULK COLLECT機能が必要です。『Oracle TimesTen In-Memory Database PL/SQL開発者ガイド』の「FORALL操作およびBULK COLLECT操作」を参照してください。 -
PL/SQLでは、
RETURNING句はWHERE CURRENT処理と一緒には使用できません。
-
例
UPDATE文を使用してdepartment_id = 110のemployeesを更新します。department_id = 110のemployeesの場合は、manager_idをjob_id = 'FI_ACCOUNT'のemployeesのmanager_idに更新します。SET句の副問合せでDISTINCT修飾子を使用します。
job_id = 'FI_ACCOUNT'のemployeesのmanager_idを検索します。
Command> SELECT manager_id FROM employees WHERE job_id = 'FI_ACCOUNT'; < 108 > < 108 > < 108 > < 108 > < 108 > 5 rows found.
次に、department_id = 110のemployeesのmanager_idを検索します。
Command> SELECT manager_id FROM employees WHERE department_id = 110; < 101 > < 205 > 2 rows found.
ここで、department_id = 110のemployeesのmanager_idを更新します。SET副問合せでSELECT DISTINCTを使用します。UPDATEの後に、department_id = 110のemployeesのmanager_idが更新されたことを確認します。
Command> UPDATE employees SET manager_id =
(SELECT DISTINCT employees.manager_id
FROM employees
WHERE employees.job_id = 'FI_ACCOUNT')
WHERE employees.department_id = 110;
2 rows updated.
Command> SELECT manager_id FROM employees WHERE department_id = 110;
< 108 >
< 108 >
2 rows found.
UPDATE文のSET句で副問合せを使用します。location_id = 1700またはlocation_id = 2400のemployeesを更新します。これらの従業員のdepartment_idをlocation_id = 2500のdepartment_idに設定します。(これはdepartment_id 80です)。これらの従業員の給与を所属する部門の最大給与に設定します。
最初の5人の従業員に対して問合せを実行してdepartment_idと給与を確認します。
Command> SELECT FIRST 5 employee_id, department_id, salary
FROM employees
ORDER BY employee_id, department_id, salary;
< 100, 90, 24000 >
< 101, 90, 17000 >
< 102, 90, 17000 >
< 103, 60, 9000 >
< 104, 60, 6000 >
5 rows found.
ここでUPDATE文を使用して従業員を更新します。
Command> UPDATE employees e1
SET department_id =
(SELECT department_id FROM departments
WHERE location_id = 2500),
salary =
(SELECT MAX(salary) FROM employees e2
WHERE e1.department_id = e2.department_id)
WHERE department_id IN
(SELECT department_id FROM departments
WHERE location_id = 2400 OR location_id = 1700);
19 rows updated.
最初の5人の従業員を再度問合せて、元のdepartment_idが90の従業員が更新されていることを確認します。department_idは80になり、給与は24000になっています。
Command> SELECT FIRST 5 employee_id, department_id, salary
FROM employees
ORDER BY employee_id, department_id, salary;
< 100, 80, 24000 >
< 101, 80, 24000 >
< 102, 80, 24000 >
< 103, 60, 9000 >
< 104, 60, 6000 >
5 rows found.
次の例は、コストが$500を超える部品の価格を25%引き上げます。
UPDATE purchasing.parts SET salesprice = salesprice * 1.25 WHERE salesprice > 500.00;
次の例は、順序seqのNEXTVAL値を使用して列を更新します。
UPDATE student SET studentno = seq.NEXTVAL WHERE name = 'Sally';
次の問合せは、1つでも未出荷注文のあるすべての顧客のステータスを更新します。
UPDATE customers SET customers.status = 'unshipped' WHERE customers.id = ANY (SELECT orders.custid FROM orders WHERE orders.status = 'unshipped');
idが主キーでない場合、次の文はすべての重複する注文を更新します。
UPDATE orders a SET orders.status = 'shipped' WHERE EXISTS (SELECT 1 FROM orders b WHERE a.id = b.id AND a.rowid < b.rowid);
次の例は、employees表内の'Jones'という姓の従業員について、job_id、salaryおよびdepartment_idを更新します。salary、last_nameおよびdepartment_idの値が変数に返されます。
Command> VARIABLE bnd1 NUMBER(8,2);
Command> VARIABLE bnd2 VARCHAR2(25) INLINE NOT NULL;
Command> VARIABLE bnd3 NUMBER(4);
Command> UPDATE employees SET job_id='SA_MAN', salary=salary+1000,
department_id=140 WHERE last_name='Jones'
RETURNING salary*0.25, last_name, department_id
INTO :bnd1, :bnd2, :bnd3;
1 row updated.
Command> PRINT bnd1 bnd2 bnd3;
BND1 : 950
BND2 : Jones
BND3 : 140結合更新
TimesTenでは、結合更新文がサポートされています。結合更新を使用すると、副問合せの結果を使用して、表の列を1つ以上更新できます。
構文
UPDATE [Owner.]TableName SET ColumnName=Subquery [WHERE SearchCondition]
または
UPDATE [Owner.]TableName SET (ColumnName[,...])=Subquery [WHERE SearchCondition]
パラメータ
結合更新文には、次のパラメータがあります。
| パラメータ | 説明 |
|---|---|
|
|
更新する表を指定します。 |
|
|
更新する列を指定します。単一の 副問合せの選択リストの値の数は、 |
|
|
検索条件には副問合せを含めることができます。検索条件がTRUEとなる行はすべて、 |
説明
結合更新のSET句内で副問合せを使用しても、更新されるターゲット表の行数は削減されません。削減は、WHERE句を使用して指定する必要があります。したがって、WHERE句内でターゲット表の行が指定されているにもかかわらず、副問合せがこの行に対していずれの行も返さない場合、この行の更新対象列はNULL値に更新されます。
例
この例では、t1の行がt2と一致しない場合、最初のSELECTのx1の値と2番目のSELECTのx1およびy1の値はNULLに設定されます。
UPDATE t1 SET x1=(SELECT x2 FROM t2 WHERE id1=id2); UPDATE t1 SET (x1,y1)=(SELECT x2,y2 FROM t2 WHERE id1=id2);
t2と一致するt1の行のみを更新するようにUPDATE文を制限するには、副問合せを含むWHERE句を次のように指定する必要があります。
UPDATE t1 SET x1=(SELECT x2 FROM t2 WHERE id1=id2) WHERE id1 IN (SELECT id2 FROM t2); UPDATE t1 SET (x1,y1)=(SELECT x2,y2 FROM t2 WHERE id1=id2) WHERE id1 IN (SELECT id2 FROM t2);
関連項目