MySQL(Aurora)でauto_inclementを使用しているテーブルのインクリメント値をlast_insert_id()関数で取得する
プライマリキーに対してauto_inclementを設定しているテーブルがあるとします。
| CREATE TABLE `m_emp` ( | |
| `empno` bigint(20) NOT NULL AUTO_INCREMENT, | |
| `empname` varchar(255) DEFAULT NULL, | |
| `departmentid` varchar(10) DEFAULT NULL, | |
| PRIMARY KEY (`empno`) | |
| ) ENGINE=InnoDB AUTO_INCREMENT=1234567890123456790 DEFAULT CHARSET=utf8 |
このテーブルにデータをインサートします。empnoはauto_inclementなので、nullを設定すれば値が勝手に設定されます。
| mysql> insert into m_emp (empno,empname,departmentid) values (null,'takahashi','101010'); | |
| Query OK, 1 row affected (0.04 sec) |
empnoにnullを設定しましたが、auto_inclementなのでインサート文が正常に終了します。
レコードが追加されていることを確認します。
| mysql> select * from m_emp; | |
| +---------------------+------------+--------------+ | |
| | empno | empname | departmentid | | |
| +---------------------+------------+--------------+ | |
| | 5 | 従業員A | 10101001 | | |
| | 6 | 従業員B | 10101001 | | |
| | 7 | 従業員C | 10101002 | | |
| | 8 | 従業員D | 10101003 | | |
| | 1234567890123456789 | NULL | NULL | | |
| | 1234567890123456790 | takahashi | 101010 | | |
| +---------------------+------------+--------------+ | |
| 6 rows in set (0.00 sec) |
auto_inclementで「1234567890123456790」が設定されていることがわかります。次にインサート文を発行すれば「1234567890123456791」となります。
ここで、last_insert_id()関数を使用して現在のauto_inclementの値を確認することができます。
| mysql> select last_insert_id(); | |
| +---------------------+ | |
| | last_insert_id() | | |
| +---------------------+ | |
| | 1234567890123456790 | | |
| +---------------------+ | |
| 1 row in set (0.00 sec) |
auto_inclementの値をnullではなく、設定するとどうなるか確認してみます。
| mysql> insert into m_emp (empno,empname,departmentid) values (3,'takahashi','101010'); ← empnoを3で指定する | |
| Query OK, 1 row affected (0.29 sec) | |
| mysql> select * from m_emp; | |
| +---------------------+------------+--------------+ | |
| | empno | empname | departmentid | | |
| +---------------------+------------+--------------+ | |
| | 3 | takahashi | 101010 | ← レコードが追加されている | |
| | 5 | 従業員A | 10101001 | | |
| | 6 | 従業員B | 10101001 | | |
| | 7 | 従業員C | 10101002 | | |
| | 8 | 従業員D | 10101003 | | |
| | 1234567890123456789 | NULL | NULL | | |
| | 1234567890123456790 | takahashi | 101010 | | |
| +---------------------+------------+--------------+ | |
| 7 rows in set (0.00 sec) | |
| mysql> select last_insert_id(); | |
| +---------------------+ | |
| | last_insert_id() | | |
| +---------------------+ | |
| | 1234567890123456790 | ← 変わっていない | |
| +---------------------+ | |
| 1 row in set (0.00 sec) |
そうすると、empno=3のレコードが追加されています。が、last_insert_id()関数を見てみると変更がありません。
last_insert_id()を初期化する方法
last_insert_id()関数を初期化するには以下DDLを発行します。
| ALTER TABLE テーブル名 AUTO_INCREMENT = 1 |
これでlast_insert_id()関数を実行すれば0になります。
| mysql> select last_insert_id(); | |
| +------------------+ | |
| | last_insert_id() | | |
| +------------------+ | |
| | 0 | | |
| +------------------+ | |
| 1 row in set (0.00 sec) |
これでinsert文を発行すると初期化されるはずなんですが、どうも保持(復元)されてしまっています。
| mysql> select last_insert_id(); | |
| +---------------------+ | |
| | last_insert_id() | | |
| +---------------------+ | |
| | 1234567890123456791 | | |
| +---------------------+ | |
| 1 row in set (0.00 sec) |
カラムの定義から一旦auto_incrementを外し、再度auto_incrementを設定してからインサートしましたが、それでも値を保持していました。
| ALTER TABLE m_emp MODIFY COLUMN empno bigint(20) NOT NULL; | |
| ALTER TABLE m_emp MODIFY COLUMN empno bigint(20) NOT NULL AUTO_INCREMENT; |
やはり一旦drop tableしないと消えないようです。

KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES20xx),Java,AWSの大体のリソースです
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
資格:FP3,Java Bronze,GH-900,CLF-C02

コメント