MySQLでSQL ServerのSCOPE_IDENTITY()に相当する関数は?LAST_INSERT_ID()の使い方を実例付きで解説
SQL ServerのSCOPE_IDENTITY()関数に相当する機能は、MySQLではLAST_INSERT_ID()です。この関数を使うことで、直前に挿入されたレコードの自動採番ID(AUTO_INCREMENT値)を取得できます。
基本構文
SELECT LAST_INSERT_ID();
このクエリを実行すると、そのセッション内で最後に挿入されたレコードのIDが返されます。
LAST_INSERT_ID()の動作を実例で確認
ここでは、主キー列を持つテーブルを作成し、last_insert_id()の実際の動作をデモ形式で確認していきます。
ステップ1:2つのテーブルを作成する
まず、1つ目のテーブル「TestOnLastInsertIdDemo」を作成します。
mysql> create table TestOnLastInsertIdDemo
-> (
-> StudentId int NOT NULL AUTO_INCREMENT,
-> PRIMARY KEY(StudentId)
-> );
Query OK, 0 rows affected (0.95 sec)続いて、2つ目のテーブル「TestOnLastInsertIdDemo2」を作成します。
mysql> create table TestOnLastInsertIdDemo2
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (2.79 sec)ステップ2:トリガーを作成する
次に、テーブル「TestOnLastInsertIdDemo」にINSERTが実行された際に、自動的に「TestOnLastInsertIdDemo2」へもレコードを挿入するトリガーを作成します。
mysql> delimiter //
mysql> create trigger insertingTrigger after insert on TestOnLastInsertIdDemo
-> for each row begin
-> insert into TestOnLastInsertIdDemo2 values();
-> end;
-> //
Query OK, 0 rows affected (0.19 sec)
mysql> delimiter ;ステップ3:レコードを挿入して結果を確認する
テーブル「TestOnLastInsertIdDemo」にレコードを挿入します。
mysql> insert into TestOnLastInsertIdDemo values(); Query OK, 1 row affected (0.31 sec)
挿入後、last_insert_id()関数を実行して、返される値を確認してみましょう。
mysql> select last_insert_id();
実行結果は以下のとおりです。
+------------------+ | last_insert_id() | +------------------+ | 1 | +------------------+ 1 row in set (0.00 sec)
なぜ「1」が返されるのか?
上記の出力例では「1」が返されています。これは、トリガーによって「TestOnLastInsertIdDemo2」側にもレコードが挿入されているにもかかわらず、last_insert_id()が参照するのはユーザーが直接INSERTを実行した元のテーブル(TestOnLastInsertIdDemo)のみだからです。トリガー内部で発生した挿入によるIDは対象外となります。
この動作は、SQL ServerのSCOPE_IDENTITY()が「現在のスコープ内で最後に生成されたIDENTITY値」を返す仕組みとよく似ており、トリガーなどによる予期しないID取得を防げる点が大きなメリットです。なお、セッション単位で値が管理されるため、複数ユーザーが同時にINSERTしても他の接続の影響を受けることはありません。
-
SQL ServerのLIMIT句に相当する機能は?MySQLのLIMIT句とOFFSETの使い方を解説
MySQLには、SQL Serverで言うところの「LIMIT句」に相当する機能として、LIMIT句とOFFSET句が標準で用意されています。なお、SQL Serverでは同様の処理を「TOP句」や「OFFSET-FETCH句」で実現しますが、本記事ではMySQL側の書き方を中心に解説します。 LIMIT句の動きを理解するために、まずはサンプルとなるテーブルを作成し、実際にデータを取得してみましょう。テーブルはCREATEコマンドを使って作成します。 テーブルの作成 mysql> CREATE table limitDemo -> ( -> id int, -> pri
-
SQL ServerにMySQLのENUM型に相当する機能はある?代替方法を解説
結論から言うと、SQL ServerにはMySQLのENUMデータ型と完全に同じ組み込みデータ型は存在しません。しかし、VARCHAR型とCHECK制約を組み合わせることで、ENUMとほぼ同等の機能を実現できます。MySQLにおけるENUM型の基本まず、MySQL(バージョン8.0.12で動作確認済み)でのENUM型の定義方法を見てみましょう。構文は以下の通りです。create table yourTableName ( yourColumnName enum(Value1,Value2,Value3,......N) default Value1 or Value2 or Value3,..