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しないと消えないようです。

  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA