mysql update文の使い方の詳細

4648 ワード

まず、単一テーブルのUPDATE文:
UPDATE [LOW_PRIORITY] [IGNORE] tbl_name SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition] [ORDER BY ...] [LIMIT row_count]
次に、マルチテーブルのUPDATE文:
UPDATE [LOW_PRIORITY] [IGNORE] table_references SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition]
UPDATE構文では、既存のテーブル行の各列を新しい値で更新できます.
SET句は、どのカラムを変更するか、どの値を与えるかを示します.WHERE句は、更新すべきローを指定します.WHERE句がない場合は、すべてのローが更新されます.ORDER BY句が指定されている場合、指定された順序で行が更新されます.LIMIT句は、更新可能なローの数を制限する制限値を指定するために使用されます.
UPDATE文では、次の修飾子がサポートされています.
1、LOW_を使用する場合PRIORITYキーワードは、UPDATEの実行が他のクライアントがテーブルから読み込まないまで遅延される.
2.IGNOREキーワードを使用すると、更新中にエラーが発生しても、更新文は中断されません.重複キーワードの競合が発生した場合、ローは更新されません.カラムが更新されると、新しい値がデータ変換エラーを引き起こす場合、ローは最も近い合法的な値に更新されます.
1つの式でtbl_を通過する場合nameがカラムにアクセスすると、UPDATEはカラムの現在の値を使用します.
たとえば、現在の値よりも多くの年齢列を設定します.

   mysql> UPDATE persondata SET age=age+1; 
 

 
UPDATE付与値は左から右に評価される.
たとえば、年齢列を2倍にしてから、次のようにします.

   mysql> UPDATE persondata SET age=age*2, age=age+1; 
 

 
カラムを現在含まれている値に設定すると、MySQLはそれに気づきますが、更新されません.
NOT NULLとして定義されたカラムをNULLに更新すると、カラムタイプに対応するデフォルト値に設定され、警告数が加算されます.数値タイプの場合、デフォルト値は0です.文字列タイプの場合、デフォルト値は空の文字列(')です.日付と時刻のタイプでは、デフォルト値は「ゼロ」です.
UPDATEは、実際に変更されたローの数を返します.Mysql_info()C API関数は、一致および更新されたローの数、およびUPDATEプロセス中に生成された警告の数を返すことができる.
LIMIT row_をご利用いただけますcountはUPDATEの範囲を限定します.LIMIT句は行に一致する限定です.WHERE句を満たすrow_を見つけたらcount行の場合、文は変更されたかどうかにかかわらず中止されます.
UPDATE文にORDER BY文が含まれている場合は、文によって指定された順序でローが更新されます.
複数のテーブルを含むUPDATE操作も実行できます.table_references句には、コンビネーションに含まれるテーブルがリストされます.
例:
 
  
SQL>UPDATE items,month SET items.price=month.price
WHERE items.id=month.id;

説明:上記のコードはカンマオペレータを使用する内部コンビネーションを示していますが、multiple-table UPDATE文はSELECT文で許可されている任意のタイプのコンビネーション、例えばLEFTJOINを使用できます.
注記:ORDER BYまたはLIMITをmultiple-table UPDATEと併用することはできません.
変更されたmultiple-table UPDATEでは、一部のカラムが参照されます.これらのカラムのUPDATE権限のみが必要です.一部のカラムは読み込まれましたが、変更されていません.これらの列のSELECT権限のみが必要です.
Multiple-table UPDATE文に外部キー制限のあるInnoDBテーブルが含まれている場合は、MySQLオプティマイザがテーブルを処理する順序が上下レベルの関係の順序と異なる場合があります.
この場合、文は無効でロールバックされます.同時に、単一テーブルを更新し、ON UPDATE機能に依存します.この機能はInnoDBによって提供され、他のテーブルに対して対応する修正を行うために使用されます.
現在、サブクエリでテーブルを更新しながら、同じテーブルから選択することはできません.
update文のいくつかの基本的な使い方
A.簡単なUPDATEを使う
次の例では、UPDATE文からWHERE句を削除すると、すべての行がどのような影響を受けるかを示します.
次の例では、表publishersのすべての出版社がジョージア州アトランタ市に本社を移転した場合、表publishersがどのように更新されるかを示します.
 
  
UPDATE publishers
SET city = 'Atlanta', state = 'GA'

この例では、すべての出版社の名前をNULLに変更します.
 
  
UPDATE publishers
SET pub_name = NULL

計算値は更新でも使用できます.この例では、テーブルtitlesのすべての価格を2倍にします.
 
  
UPDATE titles
SET price = price * 2

B.WHERE句をUPDATE句とともにWHERE句を使用して更新する行を指定します.例えば、次のような架空の事件で北カリフォルニアはPacifica(PCと略称)に名前を変更し、オークランドの市民投票で都市の名前をBay Cityに変更することにしました.この例は、オークランド市以前のすべての住民(住所が古い)のためにテーブルauthorsを更新する方法を示しています.
 
  
UPDATE authors
    SET state = 'PC', city = 'Bay City'
       WHERE state = 'CA' AND city = 'Oakland'

北カリフォルニアの他の都市の住民の州名を変更するには、別の文を作成する必要があります.
C.UPDATE文で別のテーブルからの情報を使用するこの例では、テーブルtitlesのytd_を変更するsales列は、テーブルsalesの最新の販売レコードを反映します.
 
  
UPDATE titles
    SET ytd_sales = titles.ytd_sales + sales.qty
       FROM titles, sales
          WHERE titles.title_id = sales.title_id
          AND sales.ord_date = (SELECT MAX(sales.ord_date) FROM sales)

この例では、特定の商品が特定の日付で1ロットの販売量のみを記録し、更新が最新であると仮定します.そうでない場合(すなわち、特定の商品が同じ日に複数の販売量を記録できる場合)、ここに示す例はエラーになります.例は正しく実行できますが、各商品は実際に何ロット販売されたかにかかわらず、1ロットの販売量で更新されます.これは、1つのUPDATE文が同じローに対して2回更新されないためです.
特定の商品が同じ日に複数のロットを販売できる場合、各商品のすべての販売量をUPDATE文で合計する必要があります.次の例に示します.
 
  
UPDATE titles
    SET ytd_sales =
       (SELECT SUM(qty)
          FROM sales
             WHERE sales.title_id = titles.title_id
             AND sales.ord_date IN (SELECT MAX(ord_date) FROM sales))
    FROM titles, sales

D.UPDATE文をSELECT文のTOP句とともにこの例を用いて表authorsからの最初の10人の著者のstate列を更新する.
 
  
UPDATE authors
SET state = 'ZZ'
FROM (SELECT TOP 10 * FROM authors ORDER BY au_lname) AS t1
WHERE authors.au_id = t1.au_id

以上がmysql update文の使い方のすべてであり、皆さんの役に立つことを願っています.