この文は、データベース・テーブルの既存のローを修正するために使用します。
UPDATE [ row-limitation ] table-list ] SET set-item, ... [ FROM table-expression [,...] ] [ WHERE search-condition ] [ ORDER BY expression [ ASC | DESC ] , ... ] [ OPTION( query-hint, ... ) ]
table-list : table-name [,...]
table-name : [ owner.]table-name [ [ AS ] correlation-name ] | [ owner.]view-name [ [ AS ] correlation-name ] | derived-table
derived-table : ( select-statement ) [ AS ] correlation-name [ ( column-name [,... ] ) ]
table-expression : ジョインを含む完全なテーブル式。FROM 句 を参照してください。
UPDATE table-name SET set-item, ... VERIFY ( column-name, ... ) VALUES ( expression, ... ) [ WHERE search-condition ] [ ORDER BY expression [ ASC | DESC ], ... ] [ OPTION( query-hint, ... ) ]
UPDATE [ owner.]table-name PUBLICATION publication { SUBSCRIBE BY expression | OLD SUBSCRIBE BY expression NEW SUBSCRIBE BY expression } WHERE search-condition
row-limitation : FIRST | TOP n [ START AT m ]
set-item : [ correlation-name.]column-name = { expression | DEFAULT } | [owner-name.]table-name.column-name = { expression | DEFAULT } | @variable-name = expression
query-hint : MATERIALIZED VIEW OPTIMIZATION option-value | FORCE OPTIMIZATION | FORCE NO OPTIMIZATION | option-name = option-value
table-name : [ owner.]base-table-name | temporary-table-name | derived-table-name | [ owner.]view-name
option-name : identifier
option-value : hostvar (許容されたインジケータ), string, identifier, または number
UPDATE 句 構文 1 では、table-list にテンポラリ・テーブル、派生テーブル、またはビューを含めることができます。ビューと派生テーブルは、更新可能でないものを除き、更新することができます。構文 2 および 3 では、table-name はベース・テーブルであることが必要です。
ビューを定義しているクエリ指定が更新可能な場合にかぎり、ビューに対して更新操作を実行できます。派生の関係で更新不可能なビューの識別については、ビューの操作を参照してください。
row-limitation 句 ローを制限する句を使用することによって、WHERE 句を満たすローのサブセットのみを返すことができます。TOP 値と START AT 値には、ホスト変数、整数定数、または整数変数を使用できます。TOP 値は 0 以上である必要があります。START AT 値は 0 より大きい値にする必要があります。通常、これらの句を指定する場合は、ローの順序を意味のあるものにするために ORDER BY 句も指定します。クエリが返すロー数を明示的に制限するを参照してください。
SET 句 SET 句は、カラムと値の変更方法を指定します。
SET 句は、このフォーマットを使用するカラムを計算カラム値に設定するときに使用できます。
SET column-name = expression, ... |
それぞれ指定したカラムを、等号の右側の式の値に設定します。expression には制限がありません。式が column-name である場合は、古い値が使われます。
カラムにデフォルトが定義されている場合は、SET 句を使用してカラムをデフォルト値に設定できます。この例については、例の項を参照してください。
また、SET 句は、このフォーマットを使用する変数を割り当てるときにも使用できます。
SET @variable-name = expression, ... |
変数に代入する場合、その変数がすでに宣言済みであることが必要です。また、変数名は「アット」記号 (@) で始めます。変数の代入とカラムの代入は混在させることができ、任意の数を使用できます。SET リストの代入の左辺にある名前が、更新されたテーブルのカラムと変数名に一致する場合、UPDATE 文はカラムを更新します。
次に、UPDATE 文の一部の例を示します。この文は、テーブルを更新するだけでなく、変数に代入しています。
UPDATE T SET @var = expression1, col1 = expression2 WHERE... |
これは次と同じです。
SELECT @var = expression1 FROM T WHERE... ; UPDATE T SET col1 = expression2 WHERE... |
FROM 句 FROM 句がある場合、WHERE 句は FROM 句のローが条件を満たしているかどうかを調べます。
FROM table-expression 句を使用すると、ジョインに基づいてテーブルを更新できます。table-expression には、KEY ジョインや NATURAL ジョインなどの任意の複雑なテーブル式を指定できます。FROM 句とジョインの詳細については、FROM 句を参照してください。
FROM 句を使用する場合、テーブル名を文の両方の部分において同じように修飾することが重要です。一方の場所で相関名が使用されている場合は、もう一方の場所でも同じ相関名を使用します。修飾方法が異なると、エラーが発生します。
次の文は、相関名を使用する 2 つの FROM 句を含む UPDATE 文内のテーブル名に、潜在的なあいまいさが存在することを示しています。UPDATE FROM table_1 FROM table_1 AS alias_1, table_2 AS alias_2 WHERE ... |
テーブル table_1 の相関名は、第 1 FROM 句にはありませんが、第 2 FROM 句には含まれています。この場合、第 1 FROM 句の中の table_1 は、第 2 FROM 句では alias_1 で識別されます。この文の中に table_1 のインスタンスは 1 つしかありません。これは、同じ文の中で相関名を使用する方法と使用しない方法の両方を使ってテーブルを識別する場合、テーブルの 2 つのインスタンスが考慮されるという一般規則の例外として許可されています。
ただし、次の例では、第 2 FROM 句に table_1 のインスタンスが 2 つあります。この文は構文エラーで失敗します。第 2 FROM 句の table_1 のインスタンスのうち、どれが第 1 FROM 句の table_1 の最初のインスタンスと一致するのかが明確ではないためです。
UPDATE FROM table_1 FROM table_1 AS alias_1, table_1 AS alias_2 WHERE ... |
この句は ansi_update_constraints が Off に設定されている場合のみ使用できます。ansi_update_constraints オプション [互換性]を参照してください。
ジョインの詳細については、ジョイン:複数テーブルからのデータ検索を参照してください。
詳細については、FROM 句を参照してください。
WHERE 句 WHERE 句を指定すると、探索条件を満たすローだけが更新されます。WHERE 句を指定しない場合、すべてのローが更新されます。
ORDER BY 句 通常、ローを更新する順序は重要ではありません。ただし、FIRST 句または TOP 句と一緒に使用する場合は、ローを更新する順序が意味を持ちます。
ORDER BY 句ではカラムの順序数を使用できません。
ansi_update_constraints オプションを Off に設定した場合を除き、ORDER BY 句に含まれるカラムは更新しないでください。ansi_update_constraints オプション [互換性]を参照してください。
OPTION 句 この句は、文を実行するためのヒントを指定するときに使用します。次のヒントがサポートされます。
テーブルに挿入した文字列は、データベースが大文字と小文字を区別するかどうかに関係なく、常に入力された大文字と小文字の状態のままで格納されます。文字列 Street で更新した CHAR データ型カラムは、常に大文字の S と残りの文字が小文字でデータベースに格納されます。SELECT 文は、文字列を Street として返します。ただし、データベースで大文字と小文字が区別されない場合は、すべての比較において Street は street、STREET などと同じと見なされます。さらに、単一カラムのプライマリ・キーにエントリ Street がある場合、プライマリ・キーがユニークでなくなるため、INSERT 文による street の追加は拒否されます。
新しい値が元の値と同じ場合、データは変更されません。ただし、BEFORE UPDATE トリガは、ローを対象に UPDATE が実行されるたび、新しい値が古い値と異なるかどうかに関係なく起動されます。一方、AFTER UPDATE トリガは、新しい値が古い値と異なる場合にのみ起動されます。
UPDATE 文の構文 1 は、1 つまたは複数のテーブルのロー内の値を修正します。構文 2 と構文 3 は SQL Remote だけに適用できます。
構文 2 は、SQL Remote だけのための構文であり、Message Agent によって 1 つのテーブルの 1 つのローの更新が実行されます。VERIFY 句には、更新するローの中にあると予想される値のセットを含めます。値が一致しない場合、UPDATE が処理される前に RESOLVE UPDATE トリガが起動されます。UPDATE は失敗しませんが、それは単に VERIFY 句が一致に失敗するからです。
UPDATE 文の構文 3 は、特定の SQL Remote 機能を実装するために使用したり、BEFORE トリガ内で使用したりします。この文は、リストが変更されるたびに、SUBSCRIBE BY 値の完全なリストを提供します。これは、SQL Remote トリガに配置され、データベース・サーバが SUBSCRIBE BY 値の現在のリストを計算できるようにします。両方のリストがトランザクション・ログ内に記録されます。
Message Agent は 2 つのリストを使用して、ローが必要な、ローを保有しない任意のリモート・データベースにローが移動したことを確認します。また、Message Agent は、ローを保有し、そのローが不要になったリモート・データベースからローを削除します。そのローを保有し、依然そのローを必要とするリモート・データベースは、UPDATE 文の影響を受けません。
SUBSCRIBE BY 句内のサブクエリを使って作成したパブリケーションについては、UPDATE 文の構文 3 を含むトリガを作成してローがそれぞれの正しいサブスクリプションに格納されていることを確認します。
UPDATE 文の構文 3 を使用すると、古い SUBSCRIBE BY リストと新しい SUBSCRIBE BY リストを明示的に指定して、SQL Remote トリガの効率を高めることができます。このリストがないと、データベース・サーバはパブリケーション定義から古い SUBSCRIBE BY リストを計算します。通常は、新しい SUBSCRIBE BY リストは古い SUBSCRIBE BY リストとほんのわずか異なるだけなので、古いリストの処理は 2 回行われます。古いものと新しいリストの両方を指定すると、この余分な作業を避けることができます。
SUBSCRIBE BY 式は、値またはサブクエリのいずれかです。
UPDATE 文の構文 3 を使うと、トランザクション・ログ内にエントリが作成されますが、データベース・テーブルは変更されません。
UPDATE 文を使用してデータを大量に更新する場合も、カラム統計は更新されます。
修正対象のカラムに対する UPDATE パーミッションが必要です。
カラム統計が更新されます。
SQL/2003 構文 1 はコア機能です。ただし、FROM 句と ORDER BY 句はベンダ拡張です。構文 2 と 3 は、SQL Remote だけに対するベンダ拡張です。
SQL/2003 との互換性を確保するために、ansi_update_constraints オプションは必ず Strict に設定してください。ansi_update_constraints オプション [互換性]を参照してください。
次の例では、サンプル・データベースを使用して、従業員 Philip Chin (employeeID = 129) を販売部からマーケティング部に異動する例を示します。
UPDATE Employees SET DepartmentID = 400 WHERE EmployeeID = 129; |
次の例では、サンプル・データベースを使用して、既存するすべての受注の ID から 2000 を引いて番号をふり直します。
UPDATE SalesOrders AS orders SET orders.ID = orders.ID - 2000 ORDER BY orders.ID ASC; |
この更新が可能となるのは、SalesOrderItems テーブル (プライマリ・キー SalesOrders.ID を参照する) の外部キーがアクション ON UPDATE CASCADE を使用して定義されている場合だけです。SalesOrderItems テーブルも更新されます。
外部キーのプロパティの詳細については、ALTER TABLE 文と CREATE TABLE 文を参照してください。
この例は、サンプル・データベースを使用して、データベースの現在の独立性レベル設定ではなく、独立性レベル 2 で製品の価格を変更します。
UPDATE Products SET UnitPrice = 7.00 WHERE ID = 501 OPTION( isolation_level = 2 ); |
次の例は、テーブルを更新して、列をデフォルト値に設定する方法を示します。この例では、テーブル MyTable を作成し、このテーブルにデータを移植します。次に、SET 句を指定して UPDATE 文を実行し、カラム値をデフォルトに変更します。
CREATE TABLE MyTable( PK INT PRIMARY KEY DEFAULT AUTOINCREMENT, TableName CHAR(128) NOT NULL, TableNameLen INT DEFAULT 20, LastUser CHAR(10) DEFAULT last user, LastTime TIMESTAMP DEFAULT TIMESTAMP, LastTimestamp TIMESTAMP DEFAULT @@dbts ); INSERT INTO MyTable WITH AUTO NAME SELECT LENGTH(t.table_name) AS TableNameLen, t.table_name AS TableName FROM SYS.SYSTAB t WHERE table_id<=10; UPDATE MyTable SET LastTime = DEFAULT, LastTimestamp = DEFAULT WHERE TableName LIKE '%sys%'; |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |