データベーステーブルにある既存のローを変更します。
UPDATE [ row-limitation ] table-expression [, ...] SET set-item[, ...] [ WHERE search-condition ] [ ORDER BY expression [ ASC | DESC ] , ...] [ OPTION( query-hint, ... ) ]
table-expression :ジョイン、外部ジョイン、ビュー、派生テーブルを含むことのできるテーブル式。 FROM 句を参照してください。
UPDATE [ row-limitation ] table-name SET set-item[, ...] FROM table-expression [, ...] ] [ WHERE search-condition ] [ ORDER BY expression [ ASC | DESC ] , ...] [ OPTION( query-hint, ... ) ]
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 [, ...] ) ]
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 { ALL | limit-expression } [ START AT startat-expression ] limit-expression : simple-expression startat-expression : simple-expression simple-expression : integer | variable | ( simple-expression ) | ( simple-expression { + | - | * } simple-expression )
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 と構文 2 では、table-expression にテンポラリテーブル、グローバルテンポラリテーブル、派生テーブル、またはビューを含めることができます。ビューと派生テーブルは、更新可能でないものを除き、更新することができます。構文 1 では、複数の table-expression のリストが、基本となるテーブル式でフォーマットされたローの直積になります。これは、WHERE 句を使用して制限することができます。構文 1 と構文 2 はどちらもジョインの更新を許可します。構文 3 および構文 4 では、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, ... |
変数に値を代入する場合、その変数がすでに宣言済みであることが必要です。また、変数名はアット記号 (@) で始めます。変数名が更新されるテーブルのカラム名と一致している場合、UPDATE 文はカラム値を更新し、変数は変更しないでそのままにします。変数の代入とカラムの代入は任意の順序で混在させることができます。
FROM 句 FROM table-expression 句を使用すると、ジョインに基づいてテーブルを更新できます。table-expression には、OUTER、CROSS、NATURAL ジョインなどの任意の複雑なテーブル式を指定できます。
FROM 句が存在する場合、table-name では更新される単一のテーブルを指定します。この名前は FROM 句と同じように修飾されている必要があります。FROM 句で相関名が使用されている場合、同一の相関名を table-name として指定します。更新されるテーブル式が派生テーブルの場合、派生テーブルを table-name の指定で繰り返す必要があります。
ansi_update_constraints オプションが Strict に設定されている場合、構文 2 は使用できません。
FROM 句が指定されている場合、SET 句では更新される table-name のカラムのみを指定できます。修飾方法が異なると、エラーが発生します。
次の文は、構文 2 を使用した UPDATE 文に相関名を使用したテーブル式が含まれており、この文のテーブル名に潜在的なあいまいさが存在することを示しています。
UPDATE table_1 SET column_1 = ... FROM table_1 AS alias_1, table_1 AS alias_2 WHERE ... |
ここで、FROM 句の table_1 の各インスタンスには相関名があり、table_1 のそれ自体へのセルフジョインを示しています。ただし、この UPDATE 文はセルフジョインを構成するローのうち、どのローを更新対象とするかの指定に失敗します。これは、次のように、UPDATE 文の相関名を指定することで修正できます。
UPDATE table_1 as alias_1 SET column_1 = ... FROM table_1 AS alias_1, table_1 AS alias_2 WHERE ... |
WHERE 句 WHERE 句を指定すると、探索条件を満たすローだけが更新されます。WHERE 句を指定しない場合、すべてのローが更新されます。
ORDER BY 句 通常、ローを更新する順序は重要ではありません。ただし、FIRST 句または TOP 句と一緒に使用する場合は、ローを更新する順序が意味を持ちます。
ORDER BY 句ではカラムの順序数を使用できません。
ORDER BY 句を使用するときは、ansi_update_constraints オプションを Strict に設定しないでください。
ORDER BY 句に含まれるカラムを更新するには、ansi_update_constraints オプションを Off に設定します。
OPTION 句 この句は、文を実行するためのヒントを指定するときに使用します。次のヒントがサポートされます。
OPTION( isolation_level = ... )
の指定は、クエリの独立性レベルを指定する他のいずれの手段よりも優先されることに注意してください。
テーブルに挿入した文字列は、データベースが大文字と小文字を区別するかどうかに関係なく、常に入力された大文字と小文字の状態のままで格納されます。文字列 Street で更新した CHAR データ型カラムは、常に大文字の S と残りの文字が小文字でデータベースに格納されます。SELECT 文は、文字列を Street として返します。ただし、データベースで大文字と小文字が区別されない場合は、すべての比較において Street は street、STREET などと同じと見なされます。さらに、単一カラムのプライマリキーにエントリ Street がある場合、プライマリキーがユニークでなくなるため、別のローのプライマリキーの street への UPDATE は拒否されます。
新しい値が元の値と同じ場合、データは変更されません。ただし、BEFORE UPDATE トリガーは、ローを対象に UPDATE が実行されるたび、新しい値が古い値と異なるかどうかに関係なく起動されます。一方、AFTER UPDATE トリガーは、新しい値が古い値と異なる場合にのみ起動されます。
構文 3 と構文 4 は SQL Remote だけに適用できます。
構文 3 は、SQL Remote だけのための構文であり、Message Agent によって 1 つのテーブルの 1 つのローの更新が実行されます。VERIFY 句には、更新するローの中にあると予想される値のセットを含めます。値が一致しない場合、UPDATE が処理される前に RESOLVE UPDATE トリガーが起動されます。UPDATE は失敗しませんが、それは単に VERIFY 句が一致に失敗するからです。
UPDATE 文の構文 4 は、特定の SQL Remote 機能を実装するために使用したり、BEFORE トリガー内で使用したりします。この文は、リストが変更されるたびに、SUBSCRIBE BY 値の完全なリストを提供します。これは、SQL Remote トリガーに配置され、データベースサーバーが SUBSCRIBE BY 値の現在のリストを計算できるようにします。両方のリストがトランザクションログ内に記録されます。
Message Agent は 2 つのリストを使用して、ローが必要な、ローを保有しない任意のリモートデータベースにローが移動したことを確認します。また、Message Agent は、ローを保有し、そのローが不要になったリモートデータベースからローを削除します。そのローを保有し、依然そのローを必要とするリモートデータベースは、UPDATE 文の影響を受けません。
SUBSCRIBE BY 句内のサブクエリを使って作成したパブリケーションについては、UPDATE 文の構文 4 を含むトリガーを作成してローがそれぞれの正しいサブスクリプションに格納されていることを確認します。
UPDATE 文の構文 4 を使用すると、古い SUBSCRIBE BY リストと新しい SUBSCRIBE BY リストを明示的に指定して、SQL Remote トリガーの効率を高めることができます。このリストがないと、データベースサーバーはパブリケーション定義から古い SUBSCRIBE BY リストを計算します。通常は、新しい SUBSCRIBE BY リストは古い SUBSCRIBE BY リストとほんのわずか異なるだけなので、古いリストの処理は 2 回行われます。古いものと新しいリストの両方を指定すると、この余分な作業を避けることができます。
SUBSCRIBE BY 式は、値またはサブクエリのいずれかです。
UPDATE 文の構文 4 を使うと、トランザクションログ内にエントリが作成されますが、データベーステーブルは変更されません。
UPDATE 文を使用してデータを大量に更新する場合も、カラム統計は更新されます。
修正対象のカラムに対する UPDATE パーミッションが必要です。
カラム統計は変更された値を反映するように更新されます。
テーブルにプライマリキー、UNIQUE 制約、または UNIQUE インデックスがある場合、一意性制約に違反しなければテーブル変更を実行できないときには、UPDATE 文の処理にテンポラリテーブルを使用する必要がある場合があります。テンポラリテーブルには、1 つ以上の一意性制約に違反している UPDATE 文で変更されたローが格納されます。これらのローは、UPDATE 文の実行時に一時的にベーステーブルから削除され、後で再挿入されます。この動作は、AFTER トリガーと他の同時接続に影響することがあります。
SQL/2008 UPDATE 文の構文 1 は SQL/2008 標準のコア機能です。構文 2 はベンダー拡張です。構文 3 と 4 は、SQL Remote だけに対するベンダー拡張です。
構文 1 には、次の 2 つのオプションの SQL 言語機能のサポートが含まれます。
1 つ以上の派生テーブルを含む可能性のあるジョインの更新に対するサポートは、オプションの SQL 言語機能 T111、"Updatable joins, unions, and columns" の一部です。
UPDATE 文の検索条件部分を形成するネストされたサブクエリで参照されるテーブルの変更に対するサポートは、オプションの SQL/2008 言語機能 F781 "Self-referencing operations" を構成します。
構文 1 の次の機能はベンダー拡張です。
FROM 句と ORDER BY 句。
row-limitation 句。
複数の table-expression を指定する機能。
SET 句を使用して変数を更新する機能。
OPTION 句。
構文 1 では、ansi_update_constraints オプションの設定によって、変更できるテーブル式の形式が制御されます。SQL/2008 コア機能との互換性を確保するために、ansi_update_constraints オプションは必ず Strict に設定してください。
次の例では、サンプルデータベースを使用して、従業員 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 テーブルも更新されます。文で ORDER BY 句が指定されており、SET 句でも順序属性が指定されているため、ansi_update_constraints オプションを Off に設定しないとエラーが返されます。
3 つめの例は、サンプルデータベースを使用して、データベースの現在の独立性レベル設定ではなく、独立性レベル 2 で製品の価格を変更します。
UPDATE Products SET UnitPrice = 7.00 WHERE ID = 501 OPTION( isolation_level = 2 ); |
4 つめの例では再度サンプルデータベースを使用し、構文 2 を使用して、現在の在庫を上回る量の注文が 1 つ以上存在する Tee Shirt の在庫をリセットします。
UPDATE Products AS a SET Quantity = 0 FROM Products a JOIN SalesOrderItems b ON a.ID = b.ProductID WHERE a.Name = 'Tee Shirt' AND b.Quantity > a.Quantity; |
5 つめの例では、構文 1 を使用して、これらの Tee Shirts の在庫をリセットし、Tee Shirt 注文の ShipDate を今日の日付にリセットします。
UPDATE Products a JOIN SalesOrderItems b on a.ID = b.ProductID SET a.Quantity = 0, b.ShipDate = CAST( NOW() AS DATE) WHERE a.Name = 'Tee Shirt' AND b.Quantity > a.Quantity |
4 つめと 5 つめの例では、ansi_update_constraints オプションを Strict 以外の値に設定する必要があります。
6 つめの例では、テーブルを更新して、カラムをデフォルト値に設定する方法を示します。この例では、テーブル 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%'; |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |