【MySQL】ユーザー定義変数とLAST_INSERT_ID()を使って2つのテーブルに異なる自動インクリメントIDを設定する方法
MySQLでは、LAST_INSERT_ID()関数とユーザー定義変数を組み合わせることで、2つのテーブルにそれぞれ異なる自動インクリメントIDを設定できます。この記事では、その具体的な手順をサンプルコード付きで解説します。
手順1: 最初のテーブルを作成する
まず、StudentIdカラムにAUTO_INCREMENT(自動インクリメント)を設定したテーブルを作成します。
mysql> create table DemoTable1 (StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY); Query OK, 0 rows affected (0.58 sec)
手順2: レコードを挿入する
INSERTコマンドを使ってテーブルにレコードを追加します。AUTO_INCREMENTカラムにはnullを指定することで、自動的に連番が採番されます。
mysql> insert into DemoTable1 values(null); Query OK, 1 row affected (0.18 sec)
手順3: 挿入されたレコードを確認する
SELECT文ですべてのレコードを表示してみましょう。
mysql> select * from DemoTable1;
実行結果は以下の通りです。
+-----------+ | StudentId | +-----------+ | 1 | +-----------+ 1 row in set (0.00 sec)
自動インクリメントによって「1」が採番されていることが確認できます。
手順4: 最後に挿入されたIDをユーザー定義変数に保存する
次に、LAST_INSERT_ID()を使って最後に挿入されたIDを取得し、ユーザー定義変数@studentIdに格納します。
mysql> set @studentId = last_insert_id(); Query OK, 0 rows affected (0.00 sec)
これで、直前に採番されたID(この場合は「1」)が変数に保持されます。
手順5: 2つ目のテーブルを作成する
続いて、2つ目のテーブルを作成します。ここでは通常のint型カラムを用意します。
mysql> create table DemoTable2 (Id int); Query OK, 0 rows affected (0.61 sec)
手順6: 変数を利用して異なるIDを挿入する
ここがポイントです。ユーザー定義変数に「+1」した値を挿入することで、1つ目のテーブルとは異なる自動連番を実現できます。
mysql> insert into DemoTable2 values(@studentId + 1); Query OK, 1 row affected (0.13 sec)
手順7: 結果を確認する
SELECT文で2つ目のテーブルの内容を確認しましょう。
mysql> select * from DemoTable2;
実行結果は以下の通りです。
+------+ | Id | +------+ | 2 | +------+ 1 row in set (0.00 sec)
まとめ
このように、LAST_INSERT_ID()で取得した直近の自動インクリメント値をユーザー定義変数に保存すれば、別テーブルに対しても「元のID + 1」といった形で、重複しない異なる連番IDを簡単に設定できます。トランザクション内で複数テーブルに関連IDを振りたい場合などに活用すると便利です。
-
MySQLで2つのテーブルを比較して欠落しているIDを抽出する方法
MySQLで2つのテーブルを比較し、片方のテーブルに存在しないID(欠落しているID)を取得したい場合は、サブクエリとNOT IN句を組み合わせるのが基本的な方法です。基本構文以下が、2つのテーブルを比較して欠落しているIDを返すための基本構文です。SELECT テーブル名1.IDカラム名 FROM テーブル名1WHERE IDカラム名 NOT IN (SELECT テーブル名2.IDカラム名 FROM テーブル名2);この構文では、サブクエリで2つ目のテーブルに存在するIDの一覧を取得し、1つ目のテーブルの中でその一覧に含まれないIDだけを抽出しています。それでは、実際にサンプルデータを使っ
-
JavaでMySQLのSELECTクエリにPreparedStatement(プリペアドステートメント)を使う方法
executeQuery()メソッドの基本的な使い方JavaからMySQLに対してSELECTクエリを実行する場合は、PreparedStatementオブジェクトのexecuteQuery()メソッドを使用します。基本構文は以下の通りです。yourPreparedStatementObject = yourConnectionObject.prepareStatement(yourQueryName);yourResultSetObject = yourPreparedStatementObject.executeQuery();それでは、実際にサンプルデータベース「sample」を使って手