複数行INSERT時にMySQLのLAST_INSERT_ID()関数はどのような値を返すのか?
MySQLのLAST_INSERT_ID()関数は、直近で自動生成された連番(AUTO_INCREMENT値)を返すことで知られています。しかし、複数行を一度に挿入した場合、この関数が返すのは最初に挿入された行に対して生成された連番である点に注意が必要です。
例
mysql> Insert into Student(Name) values('Ram'),('Mohan'),('Aryan');
Query OK, 3 rows affected (0.03 sec)
Records: 3 Duplicates: 0 Warnings: 0
上記のクエリは、複数行INSERT文を使ってStudentテーブルに3件のデータを一括挿入しています。テーブル内の「Id」カラムの値は、次のクエリで確認できます。
mysql> Select * from Student; +----+-------+ | Id | Name | +----+-------+ | 1 | Raman | | 2 | Rahul | | 3 | Ram | | 4 | Mohan | | 5 | Aryan | +----+-------+ 5 rows in set (0.00 sec)
この結果を見ると、LAST_INSERT_ID()は「5」を返すように思えるかもしれません。しかし実際には、次のように「3」が返されます。
mysql> Select Last_Insert_Id(); +------------------+ | Last_Insert_Id() | +------------------+ | 3 | +------------------+ 1 row in set (0.00 sec)
これは、今回の複数行INSERT文において、最初に挿入された行(Ram)に割り当てられたIDが「3」だからです。つまり、LAST_INSERT_ID()は最後に挿入された行ではなく、そのINSERT文で最初に生成されたAUTO_INCREMENT値を返すという仕様になっています。
補足:複数行INSERT時の注意点
この仕様により、複数行INSERT後に各行のIDを個別に取得したい場合は、LAST_INSERT_ID()だけでは不十分です。「最初に返されたID+挿入行数−1」という範囲でIDが連続して採番されることを利用して算出するか、あるいはアプリケーション側でIDを管理するなどの対策が必要になります。
-
MySQLでCHAR()関数の逆の処理を行う方法|ASCII()とORD()の違いを解説
MySQLにおいて、CHAR()関数の逆の働きをするのは ASCII() 関数と ORD() 関数です。CHAR() は数値(文字コード)を文字に変換する関数ですが、ASCII() は引数の文字列の左端の文字に対応する数値(ASCIIコード)を返し、ORD() は左端の文字の文字コードを返します。 ASCII()とORD()の違い どちらも文字から数値への変換を行う点は共通していますが、以下のような違いがあります。 ASCII():シングルバイト文字専用。マルチバイト文字を渡すと警告が出て64を返します。 ORD():マルチバイト文字にも対応しており、最初のバイトの値に基づいて計算された文字
-
MySQLクエリでIF文を使う正しい方法を徹底解説
MySQLのクエリ内で条件分岐を行いたい場合、IF関数を使用します。SELECT文の中にIFを組み込むことで、条件の結果に応じて異なる値を返すことができます。IF関数の基本構文MySQLクエリにIFステートメントを挿入するには、以下の構文を使用します。SELECT yourColumnName, IF(yourCondition, yourStatement1, yourStatement2) FROM yourTableName;IF関数は3つの引数を取ります。第1引数(yourCondition):評価される条件式第2引数(yourStatement1):条件がTRUEの場合に返す値第3引