よく、 result.LastInsertId()
とか $conn->lastInsertId()
みたいなのをよく見ると思うが、あれってどうやって取得しているんだろうと思って調べていたら、 OK_Packet
というものに affected_rows
や last_insert_id
を詰めて返却してくれているみたい。
なんとなくauto incrementな値はinsert/update時に確定して、responseで帰ってきてそうなイメージがあったが、それが OK_Packet
に該当する。
あまり良く考えずに SELECT LAST_INSERT_ID()
を使うとthread safeに処理できないので気をつけたい
PDOはC言語で読む気がしないが、GoのDriverはGoで書かれているから読みやすい
https://github.com/go-sql-driver/mysql/blob/master/packets.go#L667-L698