MYSQLでUPDATE文を利用する場合の構文

単一テーブル構文:


UPDATE [LOW_PRIORITY] [IGNORE] tbl_name
SET col_name1=expr1 [, col_name2=expr2 ...]
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]

単一テーブル構文には、UPDATE ステートメントは新しい値を利用して tbl_name 内に既存行のカラムを
更新します。SET 条項は、どのカラムを変更し、それらにはどの値が与えられるべきかという事を指示します。
もし WHERE 条項が与えられたら、それはどの行を更新するべきかを決定します。WHERE 条項が無ければ、
全ての行が更新されます。もし ORDER BY 条項が指定されると、指定された順に行が更新されます。
LIMIT 条項は、更新できる行数に制限を設定します。

update_single_table

複合テーブル構文:


UPDATE [LOW_PRIORITY] [IGNORE] table_references
SET col_name1=expr1 [, col_name2=expr2 ...]
[WHERE where_condition]

複合テーブル構文には、UPDATE が、条件を満たす table_references
で名づけられたそれぞれのテーブルの行を更新します。この場合、ORDER BY と LIMIT を利用する事はできません
※  MySQL バージョン 4.0.4 以降では、複数のテーブルに対する UPDATE 操作も実行可能。


UPDATE items,month SET items.price=month.price
WHERE items.id=month.id;

上の例では、カンマ演算子を使用した内部結合を示していますが、複数テーブルの
UPDATE ステートメントでは、LEFT JOIN など、SELECT ステートメントで使用可能な任意
の結合型を使用することができます。


mysql> update MYSQLIMP,MYSQLIMP2 set MYSQLIMP.n = MYSQLIMP2.n
-> where MYSQLIMP.id = MYSQLIMP2.id
-> and MYSQLIMP.id = 100;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

update_multi_tables

UPDATE ステートメントは次の修飾因子をサポートします。

もし LOW_PRIORITY キーワードを利用すると、別のクライアントがテーブルからの
読み込みをしなくなるまで、UPDATE の実行が遅れます。

もし IGNORE キーワードを利用すると、更新中にエラーが発生しても更新ステートメントは異常終了しません。
複製キーの矛盾が起きた行は更新されません。データ変換エラーを起こす値にカラムが更新された行は、
代わりに一番近い有効値に更新されます。

単一テーブル UPDATE 割り当ては通常左から右に評価されます。複合テーブルの更新に関しては、
割り当てが特定の順番で行われるという保証はありません。

NULL に設定する事で NOT NULL を宣言されたカラムを更新すると、カラムはそのデータ タイプに
適切なデフォルト値に設定され、警告カウントはインクリメントされます。
数値タイプ、文字列タイプの空の文字列(”)、そして日付と時刻タイプの「ゼロ」 値のデフォルト値は 0 です。

UPDATE の領域を制限する為に LIMIT row_count を利用する事ができます。
LIMIT 条項は行に一致した制限です。ステートメントは、実際に変更されたかどうかに関わらず、
WHERE 条項の条件を満たす row_count 行を見付けるとすぐに止まります。

もし UPDATE ステートメントが ORDER BY 条項を含むなら、行は条項に指示された順番で更新されます。
これは、エラーが起こるかもしれない特定の場合に有効です。
複合テーブルをカバーする UPDATE 演算を行う事もできます。
.しかし、複合テーブル UPDATE と共に ORDER BY や LIMIT を利用する事はできません。


LIMIT 条項は SELECT ステートメントに返された行数を制限するのに利用する事ができます。
LIMIT は、負数以外の整数定数でなければいけない、1つか2つの数値引数を取ります。
(準備されたステートメントを利用している時以外)

その2つの引数のうち、最初の物は返される最初の行のオフセットを指定し、2つめの物は返される行の
最高数を指定します。冒頭の行のオフセットは0です。(1ではありません)

SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15

1つの引数で、その値は結果セットの最初から返される行数を指定します。

SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows

言い換えると、LIMIT row_count は LIMIT 0, row_count と同等だという事になります。

1行返します

SET @a=1; /* SELECT @a :=1 */
PREPARE STMT FROM 'SELECT * FROM City LIMIT ?';
EXECUTE STMT USING @a;

prepare_limit

2行目から6行目を返します

SET @skip=1; SET @numrows=5;
PREPARE STMT FROM 'SELECT * FROM City LIMIT ?, ?';
EXECUTE STMT USING @skip, @numrows;

prepare_limit_row

1行目~5行目まで
prepare_limit_row_0


LIMIT 節を使用すると、SELECT ステートメントで返されるレコード数を制限することができる。
LIMIT は 1 つまたは 2 つの数値引数を取る。これらの引数は整数定数でなければならない。

引数が 1 つの場合、その値は、戻り値として返す、結果セットの冒頭からのレコード数を表す。
引数が 2 つの場合、最初の引数は戻り値として返す最初のレコードまでのオフセットを表し、
2 つ目の引数は戻り値として返す最大レコード数を表す。最初のレコードのオフセット値は 0(1 ではない)。

mysql> select * from City limit 10; #Retrieve rows 0-10;
limit0

mysql> select * from City limit 5,10; #Retrieve rows 5-10;
limit5-10

全ての行を一定のオフセットから結果セットの最後まで検索するには、
2つめのパラメータに大きい数字を利用する事ができます。
このステートメントは96番目の行から最後まで全ての行を検索します。
mysql> select * from City LIMIT 95,18446744073709551615;

用意されたステートメントには、プレースホルダを利用する事ができます。
次のステートメントは tbl テーブルから行を1つ返します。


SET @a=1;
PREPARE STMT FROM 'SELECT * FROM City LIMIT ?';
EXECUTE STMT USING @a;

set

次のステートメントは tbl テーブルから2行目から6行目を返します。

SET @skip=1; SET @numrows=5;
PREPARE STMT FROM 'SELECT * FROM City LIMIT ?, ?';
EXECUTE STMT USING @skip, @numrows;

limit_1

参考サイト
12.2.7. SELECT 構文