MySQL、SQL、MariaDB で INSERT ステートメントを使って複数行挿入し、LAST_INSERT_ID() や RETURNING 句、トリガーを使って ID を取得する方法

2024-04-02

MySQL、SQL、MariaDB で複数行挿入時の ID を取得する方法

MySQL、SQL、MariaDB などのデータベースで、INSERT ステートメントを使用して複数の行を挿入する場合、挿入された各行の ID を取得する方法があります。

方法

  1. LAST_INSERT_ID() 関数を使用する

この関数は、最後に挿入された行の ID を返します。複数の行を挿入する場合、最後に挿入された行の ID のみ取得できます。

INSERT INTO table (column1, column2) VALUES (value1, value2), (value3, value4);

# 最後に挿入された行の ID を取得
SELECT LAST_INSERT_ID();
  1. RETURNING 句を使用する

RETURNING 句は、INSERT ステートメントによって生成された行の列値を返すことができます。

INSERT INTO table (column1, column2) VALUES (value1, value2), (value3, value4)
RETURNING id;
  1. トリガーを使用する

トリガーは、データベース内のデータ変更イベントに応答して実行されるプログラムです。INSERT ステートメント後にトリガーを実行して、挿入された行の ID を取得できます。

注意事項

  • LAST_INSERT_ID() 関数は、最後に挿入された行の ID のみ取得できます。
  • RETURNING 句は、PostgreSQL などの特定のデータベースでのみ使用できます。
  • トリガーは、複雑な設定が必要になる場合があります。

上記以外にも、特定のデータベースやフレームワークに特化した方法で、挿入された行の ID を取得できる場合があります。詳細は、使用しているデータベースやフレームワークのドキュメントを参照してください。

補足

  • 上記の例は、基本的な使用方法を示しています。実際の使用例では、必要に応じて条件分岐やエラー処理などを追加する必要があります。
  • データベースのバージョンや設定によって、動作が異なる場合があります。



MySQL

-- テーブルの作成
CREATE TABLE IF NOT EXISTS `users` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(255) NOT NULL,
  `email` VARCHAR(255) NOT NULL,
  PRIMARY KEY (`id`)
);

-- 複数行の挿入
INSERT INTO `users` (name, email) VALUES
  ('John Doe', '[email protected]'),
  ('Jane Doe', '[email protected]');

-- 最後に挿入された行の ID を取得
SELECT LAST_INSERT_ID();

-- RETURNING 句を使用する
INSERT INTO `users` (name, email) VALUES
  ('John Doe', '[email protected]'),
  ('Jane Doe', '[email protected]')
RETURNING id;

-- トリガーを使用する
DELIMITER //

CREATE TRIGGER after_insert_user
AFTER INSERT ON `users`
FOR EACH ROW
BEGIN
  # 挿入された行の ID を取得
  SELECT NEW.id;
END;
//

DELIMITER ;

-- 複数行の挿入
INSERT INTO `users` (name, email) VALUES
  ('John Doe', '[email protected]'),
  ('Jane Doe', '[email protected]');

PostgreSQL

-- テーブルの作成
CREATE TABLE IF NOT EXISTS users (
  id SERIAL PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  email VARCHAR(255) NOT NULL
);

-- 複数行の挿入
INSERT INTO users (name, email) VALUES
  ('John Doe', '[email protected]'),
  ('Jane Doe', '[email protected]');

-- RETURNING 句を使用する
INSERT INTO users (name, email) VALUES
  ('John Doe', '[email protected]'),
  ('Jane Doe', '[email protected]')
RETURNING id;

MariaDB

-- テーブルの作成
CREATE TABLE IF NOT EXISTS users (
  id INT NOT NULL AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL,
  email VARCHAR(255) NOT NULL,
  PRIMARY KEY (`id`)
);

-- 複数行の挿入
INSERT INTO users (name, email) VALUES
  ('John Doe', '[email protected]'),
  ('Jane Doe', '[email protected]');

-- 



他の方法

INSERT INTO ... SELECT ステートメントを使用して、別のテーブルからデータを取得して挿入し、同時に ID を取得できます。

-- テーブルの作成
CREATE TABLE IF NOT EXISTS `users` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(255) NOT NULL,
  `email` VARCHAR(255) NOT NULL,
  PRIMARY KEY (`id`)
);

-- 別のテーブルからデータを取得して挿入
INSERT INTO `users` (name, email)
SELECT name, email
FROM `temp_users`;

-- 挿入された行の ID を取得
SELECT LAST_INSERT_ID();

プログラミング言語の機能を使用する

使用しているプログラミング言語によっては、挿入された行の ID を取得するための独自の機能が用意されている場合があります。

  • Python
import mysql.connector

# データベースへの接続
connection = mysql.connector.connect(
  host="localhost",
  user="root",
  password="password",
  database="test"
)

# カーソルの取得
cursor = connection.cursor()

# 複数行の挿入
sql = """
INSERT INTO users (name, email) VALUES
  (%s, %s),
  (%s, %s)
"""
values = [
  ("John Doe", "[email protected]"),
  ("Jane Doe", "[email protected]")
]
cursor.executemany(sql, values)

# 挿入された行の ID を取得
last_insert_id = cursor.lastrowid

# コミット
connection.commit()

# カーソルのクローズ
cursor.close()

# 接続のクローズ
connection.close()
  • Java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class Main {

  public static void main(String[] args) throws Exception {
    // データベースへの接続
    Connection connection = DriverManager.getConnection(
      "jdbc:mysql://localhost:3306/test",
      "root",
      "password"
    );

    // PreparedStatement の作成
    PreparedStatement statement = connection.prepareStatement(
      """
      INSERT INTO users (name, email) VALUES
        (?, ?),
        (?, ?)
      """
    );

    // 複数行の挿入
    for (String[] value : Arrays.asList(
      new String[] {"John Doe", "[email protected]"},
      new String[] {"Jane Doe", "[email protected]"}
    )) {
      statement.setString(1, value[0]);
      statement.setString(2, value[1]);
      statement.addBatch();
    }
    statement.executeBatch();

    // 挿入された行の ID を取得
    ResultSet resultSet = statement.getGeneratedKeys();
    while (resultSet.next()) {
      int id = resultSet.getInt(1);
      System.out.println("ID: " + id);
    }

    // コミット
    connection.commit();

    // PreparedStatement のクローズ
    statement.close();

    // 接続のクローズ
    connection.close();
  }
}

フレームワークを使用する

  • 上記の方法の動作は、使用しているデータベース、プログラミング言語、フレームワークによって異なる場合があります。
  • 詳細は、使用しているデータベース、プログラミング言語、フレームワークのドキュメントを参照してください。

mysql sql mariadb


NULL値を扱うための高度なテクニック: ストアドプロシージャ、仮想列

NULL の主な用途:データが不足している場合データが不明な場合データが適用されない場合NULL は他の値と比較することはできません。NULL は演算に使用できません。NULL はインデックスを作成できません。NULL はストレージスペースを占有します。...


MySQLで本日日付より大きいまたは同等のDATETIMEを簡単に見つける

CURDATE() 関数と比較演算子を用いる最もシンプルな方法は、CURDATE() 関数で本日日付を取得し、比較演算子を用いて DATETIME 列と比較する方法です。このクエリは、your_table テーブルのすべてのレコードのうち、your_datetime_column の値が本日日付(CURDATE()) より大きいまたは同等なものをすべて選択します。...


MySQL の GUI ツールを使って列を削除する方法

MySQLでテーブルから列を削除するには、ALTER TABLE ステートメントを使用します。このステートメントは、テーブルの構造を変更するために使用されます。手順MySQLクライアントに接続します。削除する列を含むテーブルを選択します。次の構文を使用して ALTER TABLE ステートメントを実行します。...


MariaDB CURRENT_TIMESTAMP デフォルト値を使いこなして、タイムスタンプ管理をマスターしよう

MariaDB の CURRENT_TIMESTAMP は、現在の日時を返す関数です。デフォルト値は、レコードが作成されたときと更新されたときの両方で、現在のタイムスタンプになります。デフォルト値の動作新しいレコードを作成すると、CURRENT_TIMESTAMP を使用して TIMESTAMP または DATETIME 型の列に自動的に値が挿入されます。...


【永久保存版】MariaDB/MySQL で「更新日時」を触らずに「作成日時」を設定する方法

CURRENT_TIMESTAMP オプションを使用すると、列に挿入されるたびに自動的に現在の日付と時刻が設定されます。さらに、DEFAULT NULL オプションを組み合わせて、列に値が設定されていない場合にのみ CURRENT_TIMESTAMP を設定するようにすることができます。...