MySQLでプリペアドステートメントとして準備できるSQLステートメントの種類とは?
実は、すべてのSQLステートメントをプリペアドステートメント(PREPARE文)として準備できるわけではありません。MySQLでは、以下に挙げる種類のSQLステートメントのみがプリペアドステートメントとして利用できます。
SELECTステートメント
データを検索・取得するためのSELECT文は、最も代表的なプリペアドステートメントの対象です。プレースホルダー「?」を使って条件値を動的に渡せるのが特徴です。
実行例
mysql> PREPARE stmt FROM 'SELECT tender_value from Tender WHERE Companyname = ?'; Query OK, 0 rows affected (0.09 sec) Statement prepared mysql> SET @A = 'Singla Group.'; Query OK, 0 rows affected (0.00 sec) mysql> EXECUTE stmt using @A; +--------------+ | tender_value | +--------------+ | 220.255997 | +--------------+ 1 row in set (0.07 sec) mysql> DEALLOCATE PREPARE stmt; Query OK, 0 rows affected (0.00 sec)
INSERT・REPLACE・UPDATE・DELETEステートメント
テーブル内のデータを変更するDML(データ操作言語)ステートメントも、プリペアドステートメントとして準備できます。なお、EXECUTE時にUSING句でパラメータを渡す必要がある点に注意しましょう。パラメータを指定せずに実行するとエラーになります。
実行例
mysql> PREPARE stmt1 FROM 'DELETE from Tender WHERE Sr = ?'; Query OK, 0 rows affected (0.00 sec) Statement prepared mysql> SET @A = 4; Query OK, 0 rows affected (0.00 sec) mysql> EXECUTE stmt1; ERROR 1210 (HY000): Unknown error 1210 mysql> EXECUTE stmt1 using @A; Query OK, 1 row affected (0.08 sec) mysql> DEALLOCATE PREPARE stmt1; Query OK, 0 rows affected (0.00 sec) mysql> Select * from tender; +----+---------------+--------------+ | Sr | CompanyName | Tender_value | +----+---------------+--------------+ | 1 | Abc Corp. | 250.369003 | | 2 | Khaitan Corp. | 265.588989 | | 3 | Singla group. | 220.255997 | +----+---------------+--------------+ 3 rows in set (0.00 sec)
上記の例では、パラメータを渡さずにEXECUTEした場合にエラー(ERROR 1210)が発生し、「using @A」のようにパラメータを渡すことで正常にDELETE処理が完了していることが分かります。
CREATE TABLEステートメント
テーブルを作成するDDL(データ定義言語)の一つであるCREATE TABLE文も、プリペアドステートメントとして実行できます。
実行例
mysql> PREPARE stmt3 FROM 'CREATE TABLE Student(Id INT, Name Varchar(20))'; Query OK, 0 rows affected (0.00 sec) Statement prepared mysql> EXECUTE stmt3; Query OK, 0 rows affected (0.73 sec) mysql> DEALLOCATE PREPARE stmt3; Query OK, 0 rows affected (0.00 sec)
SET・DOおよび多くのSHOWステートメント
変数を設定するSET文、式を評価するDO文、さらにSHOW TABLESなど多くのSHOW系ステートメントも対象です。
実行例
mysql> PREPARE stmt10 FROM 'SHOW TABLES'; Query OK, 0 rows affected (0.00 sec) Statement prepared mysql> EXECUTE stmt10; +-------------------+ | Tables_in_query | +-------------------+ | emp | | emp123 | | emp_t | | examination_btech | | new_number | | student | | student_detail | | student_info | | tender | | website | +-------------------+ 10 rows in set (0.00 sec)
まとめ
MySQLのプリペアドステートメントで利用できるのは、主に以下のステートメントです。
- SELECTステートメント
- INSERT・REPLACE・UPDATE・DELETEなどのデータ操作ステートメント
- CREATE TABLEステートメント
- SET・DOおよび多くのSHOWステートメント
これら以外のステートメントはPREPARE文で準備できないため、用途に応じて通常のSQL実行を使い分けることが重要です。また、使い終わったプリペアドステートメントはDEALLOCATE PREPARE文で解放するのが良い習慣です。
-
MySQL Workbenchの列フラグ(PK・NN・AIなど)の意味を徹底解説
MySQL Workbenchでは、テーブルの列(カラム)に対してさまざまな「列フラグ」を設定することで、データの整合性を保つことができます。テーブルデザイナーで各カラムのチェックボックスに表示されるこれらのフラグは、それぞれ以下のような意味を持っています。PK - Primary Key(主キー)NN - NOT NULL(NULL値不可)BIN - Binary(バイナリ)UN - Unsigned(符号なし)UQ - Unique(一意制約)ZF - Zero Filled(ゼロ埋め)G - Generated Column(生成列)AI - Auto Increment(自動採番)それ
-
MySQLのSELECTステートメントでカンマを使える?CROSS JOINとの関係を解説
MySQLのSELECTステートメント間にカンマは使用できますか?はい、使用できます。FROM句でテーブル名をカンマ(,)で区切って指定すると、複数のテーブルを組み合わせて照会することが可能です。構文は以下の2通りがあります。構文1:select * from テーブル名1,テーブル名2; 構文2:select * from テーブル名1 cross join テーブル名2;この2つの構文は、まったく同じ結果を返します。つまり、カンマ区切りによるテーブル指定は CROSS JOIN(交叉結合)と完全に同等です。両者とも、各テーブルのすべての行を組み合わせた「直積(デカルト積)」を求める操作にな