MySQL(Aurora)でauto_inclementを使用しているテーブルのインクリメント値をlast_insert_id()関数で取得する
プライマリキーに対してauto_inclementを設定しているテーブルがあるとします。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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を設定すれば値が勝手に設定されます。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
mysql> insert into m_emp (empno,empname,departmentid) values (null,'takahashi','101010'); | |
Query OK, 1 row affected (0.04 sec) |
empnoにnullを設定しましたが、auto_inclementなのでインサート文が正常に終了します。
レコードが追加されていることを確認します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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の値を確認することができます。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
mysql> select last_insert_id(); | |
+———————+ | |
| last_insert_id() | | |
+———————+ | |
| 1234567890123456790 | | |
+———————+ | |
1 row in set (0.00 sec) |
auto_inclementの値をnullではなく、設定するとどうなるか確認してみます。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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を発行します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
ALTER TABLE テーブル名 AUTO_INCREMENT = 1 |
これでlast_insert_id()関数を実行すれば0になります。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
mysql> select last_insert_id(); | |
+——————+ | |
| last_insert_id() | | |
+——————+ | |
| 0 | | |
+——————+ | |
1 row in set (0.00 sec) |
これでinsert文を発行すると初期化されるはずなんですが、どうも保持(復元)されてしまっています。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
mysql> select last_insert_id(); | |
+———————+ | |
| last_insert_id() | | |
+———————+ | |
| 1234567890123456791 | | |
+———————+ | |
1 row in set (0.00 sec) |
カラムの定義から一旦auto_incrementを外し、再度auto_incrementを設定してからインサートしましたが、それでも値を保持していました。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント