データベーステーブルにある既存のローを変更します。
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 句 カラム名または変数を指定した expression に設定する場合は、SET 句を使用します。
SET 句は、このフォーマットを使用するカラムを計算カラム値に設定するときに使用できます。
SET column-name = expression, ... |
指定された各カラムは、expression の値に設定されます。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 権限を持っているか、または UPDATE ANY TABLE システム権限を持っていることが必要です。
カラム統計は変更された値を反映するように更新されます。
テーブルにプライマリキー、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 GROUPO.Employees SET DepartmentID = 400 WHERE EmployeeID = 129; |
次の例では、サンプルデータベースを使用して、既存するすべての受注の ID から 2000 を引いて番号をふり直します。
UPDATE GROUPO.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 に設定しないとエラーが返されます。
この例は、サンプルデータベースを使用し、データベースの現在の独立性レベル設定ではなく、独立性レベル 2 で製品の価格を変更します。
UPDATE GROUPO.Products SET UnitPrice = 7.00 WHERE ID = 501 OPTION( isolation_level = 2 ); |
この例では、ansi_update_constraints オプションを Strict 以外の値に設定する必要があります。この例では再度サンプルデータベースを使用し、構文 2 を使用して、現在の在庫を上回る量の注文が 1 つ以上存在する Tee Shirt の在庫をリセットします。
UPDATE GROUPO.Products AS a SET Quantity = 0 FROM GROUPO.Products a JOIN GROUPO.SalesOrderItems b ON a.ID = b.ProductID WHERE a.Name = 'Tee Shirt' AND b.Quantity > a.Quantity; |
この例では、ansi_update_constraints オプションを Strict 以外の値に設定する必要があります。この例では、構文 1 を使用して、これらの Tee Shirts の在庫をリセットし、Tee Shirt の注文の ShipDate を今日の日付にリセットします。
UPDATE GROUPO.Products a JOIN GROUPO.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 |
この例では、テーブルを更新して、カラムをデフォルト値に設定する方法を示します。この例では、テーブル 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 © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |