MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

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しても他の接続の影響を受けることはありません。

  1. 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

  2. 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,..