PostgreSQL クライアントライブラリを使用して最後に挿入されたIDを取得する方法
PostgreSQL 関数による最後挿入されたIDの取得
シリアル型IDの場合
PostgreSQLのテーブルにシリアル型ID列がある場合、lastinsertid()
関数を使用して、その列の最後に挿入された値を取得することができます。
INSERT INTO users (name, email) VALUES ('John Doe', '[email protected]');
SELECT lastinsertid();
この例では、users
テーブルに name
と email
の値を持つ新しい行を挿入します。その後、lastinsertid()
関数を使用して、挿入された行の id
列の値を取得します。
シーケンスを使用してIDを生成する場合、lastval()
関数を使用して、最後に生成されたシーケンス値を取得することができます。
CREATE SEQUENCE user_id_seq;
INSERT INTO users (name, email) VALUES ('Jane Doe', '[email protected]') RETURNING id;
SELECT lastval('user_id_seq');
この例では、user_id_seq
という名前のシーケンスを作成します。その後、users
テーブルに name
と email
の値を持つ新しい行を挿入し、RETURNING
句を使用して挿入された行の id
列の値を取得します。最後に、lastval()
関数を使用して、シーケンス user_id_seq
の最後に生成された値を取得します。
トリガーを使用して、挿入後にカスタム処理を実行する場合、lastinsertid()
関数を使用して、トリガー内で挿入された行のIDを取得することができます。
CREATE TRIGGER after_insert_user
AFTER INSERT ON users
FOR EACH ROW
BEGIN
INSERT INTO audit_log (user_id, action) VALUES (lastinsertid(), 'INSERT');
END;
この例では、after_insert_user
という名前のトリガーを作成します。このトリガーは、users
テーブルに新しい行が挿入されるたびに実行されます。トリガー内では、lastinsertid()
関数を使用して、挿入された行の id
列の値を取得し、audit_log
テーブルにログエントリを挿入します。
RETURNING 句を使用する場合
PostgreSQL 9.5以降では、RETURNING
句を使用して、INSERT ステートメントから直接挿入された行のIDを取得することができます。
INSERT INTO users (name, email) VALUES ('John Doe', '[email protected]') RETURNING id;
注意事項
lastinsertid()
関数は、トランザクション内で最後に挿入された行のIDのみを返します。- 複数のテーブルに挿入する場合、
lastinsertid()
関数は最後に挿入されたテーブルのIDのみを返します。 lastinsertid()
関数は、接続ごとに異なる値を返します。
- 上記の例は、PostgreSQL 14.5に基づいています。
- PostgreSQLのバージョンによって、
lastinsertid()
関数の動作が異なる場合があります。
-- シリアル型IDの場合
CREATE TABLE 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]');
SELECT lastinsertid();
-- シーケンスを使用する場合
CREATE SEQUENCE user_id_seq;
CREATE TABLE users (
id INT NOT NULL DEFAULT nextval('user_id_seq'),
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
);
INSERT INTO users (name, email) VALUES ('Jane Doe', '[email protected]') RETURNING id;
SELECT lastval('user_id_seq');
-- トリガーを使用する場合
CREATE TRIGGER after_insert_user
AFTER INSERT ON users
FOR EACH ROW
BEGIN
INSERT INTO audit_log (user_id, action) VALUES (lastinsertid(), 'INSERT');
END;
INSERT INTO users (name, email) VALUES ('John Doe', '[email protected]');
-- RETURNING 句を使用する場合
CREATE TABLE 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]') RETURNING id;
このコードを実行すると、次の結果が表示されます。
1
2
1
1
PostgreSQLで最後に挿入されたIDを取得するその他の方法
INSERT INTO users (name, email) VALUES ('John Doe', '[email protected]') RETURNING id;
pg_last_inserted_id()
関数は、lastinsertid()
関数と似ていますが、接続ごとに異なる値を返しません。
INSERT INTO users (name, email) VALUES ('John Doe', '[email protected]');
SELECT pg_last_inserted_id('users');
情報スキーマを使用して、最後に挿入されたIDを取得することもできます。
SELECT currval('users_id_seq');
この例では、users_id_seq
シーケンスの現在の値を取得します。
プログラミング言語
PostgreSQL クライアントライブラリを使用して、プログラミング言語から最後に挿入されたIDを取得することもできます。
- 簡単に使用できる方法が必要な場合は、
RETURNING
句を使用するのがおすすめです。 - 接続ごとに異なる値を返さない方法が必要な場合は、
pg_last_inserted_id()
関数を使用するのがおすすめです。 - シーケンスの現在の値を取得する必要がある場合は、情報スキーマを使用するのがおすすめです。
- プログラミング言語からIDを取得する必要がある場合は、PostgreSQL クライアントライブラリを使用するのがおすすめです。
postgresql insert lastinsertid