MySQL(Aurora)でauto_inclementを使用しているテーブルのインクリメント値をlast_insert_id()関数で取得する

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

view raw

table

hosted with ❤ by GitHub

このテーブルにデータをインサートします。empnoはauto_inclementなので、nullを設定すれば値が勝手に設定されます。


mysql> insert into m_emp (empno,empname,departmentid) values (null,'takahashi','101010');
Query OK, 1 row affected (0.04 sec)

view raw

insert

hosted with ❤ by GitHub

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)

view raw

select

hosted with ❤ by GitHub

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)

view raw

last_insert_id

hosted with ❤ by GitHub

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)

view raw

last_insert_id

hosted with ❤ by GitHub

そうすると、empno=3のレコードが追加されています。が、last_insert_id()関数を見てみると変更がありません。

last_insert_id()を初期化する方法

last_insert_id()関数を初期化するには以下DDLを発行します。


ALTER TABLE テーブル名 AUTO_INCREMENT = 1

view raw

auto_increment

hosted with ❤ by GitHub

これでlast_insert_id()関数を実行すれば0になります。


mysql> select last_insert_id();
+——————+
| last_insert_id() |
+——————+
| 0 |
+——————+
1 row in set (0.00 sec)

view raw

last_insert_id

hosted with ❤ by GitHub

これでinsert文を発行すると初期化されるはずなんですが、どうも保持(復元)されてしまっています。


mysql> select last_insert_id();
+———————+
| last_insert_id() |
+———————+
| 1234567890123456791 |
+———————+
1 row in set (0.00 sec)

view raw

last_insert_id

hosted with ❤ by GitHub

カラムの定義から一旦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;

view raw

AUTO_INCREMENT

hosted with ❤ by GitHub

やはり一旦drop tableしないと消えないようです。

コメント

株式会社CONFRAGE ITソリューション事業部をもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

タイトルとURLをコピーしました