このトピックでは、ApsaraDB RDS for PostgreSQL インスタンスの複数のデータレコードを一度に挿入、更新、および削除する方法について説明します。これらの操作により、RDS インスタンスとアプリケーション間のインタラクションの数を減らし、RDS インスタンスのデータ処理能力を高めることができます。
複数のデータレコードを一度に挿入する
次のいずれかの方法を使用して、複数のデータレコードを一度に挿入できます。
この例では、psql ツールを使用して、tbl1 という名前のテストテーブルを作成するために次の文を実行します。
CREATE TABLE tbl1 (
id SERIAL PRIMARY KEY,
info TEXT,
crt_time TIMESTAMP
);方法 1: INSERT INTO ... SELECT 文を実行する。
サンプル文
-- tbl1 テーブルに複数のデータレコードを一度に挿入します。 INSERT INTO tbl1 (id, info ,crt_time) SELECT GENERATE_SERIES(1,10000),'test',NOW(); -- データ量をクエリします。 SELECT COUNT(*) FROM tbl1;出力
count ------- 10000 (1 row)
方法 2: VALUES(),(),...(); 関数を使用する。
サンプル文
-- tbl1 テーブルに複数のデータレコードを一度に挿入します。 INSERT INTO tbl1 (id,info,crt_time) VALUES (1,'test',NOW()), (2,'test2',NOW()), (3,'test3',NOW()); -- データ量をクエリします。 SELECT COUNT(*) FROM tbl1;出力
count ------- 3 (1 row)
方法 3: BEGIN; ...複数の INSERT 文...; END; トランザクションを実行する。
説明
この方法では、1 つのトランザクションに複数の INSERT 文を含めることができます。これにより、トランザクションのコミットの待ち時間が短縮され、RDS インスタンスのパフォーマンスが向上します。
サンプル文
-- tbl1 テーブルに複数のデータレコードを一度に挿入します。 BEGIN; INSERT INTO tbl1 (id,info,crt_time) VALUES (1,'test',NOW()); INSERT INTO tbl1 (id,info,crt_time) VALUES (2,'test2',NOW()); INSERT INTO tbl1 (id,info,crt_time) VALUES (3,'test3',NOW()); END; -- データ量をクエリします。 SELECT COUNT(*) FROM tbl1;出力
count ------- 3 (1 row)
方法 4:COPY コマンドを使用する。
説明
INSERT 文と比較して、COPY コマンドは使いやすく、より効率的にデータを挿入できます。
サンプル文
-- 標準入力ストリームからデータを読み取り、tbl1 テーブルにコピーします。入力データの列は縦棒(|)で区切ります。 COPY tbl1 FROM stdin WITH (DELIMITER '|'); -- 最初のデータレコードを入力します。 1|'test'|'2023-01-01' -- 2 番目のデータレコードを入力します。 2|'test1'|'2023-02-02' -- 終了 \. -- データ量をクエリします。 SELECT COUNT(*) FROM tbl1;出力
count ------- 2 (1 row)説明使用可能な COPY 関数は、使用する言語ドライバーによって異なります。詳細については、次のドキュメントをご参照ください。
複数のデータレコードを一度に更新する
サンプル文
-- 複数のデータレコードを一度に更新します。
UPDATE tbl1 SET info=tmp.info from (VALUES (1,'new1'),(2,'new2'),(6,'new6')) AS tmp (id,info) WHERE tbl1.id=tmp.id;
-- テーブルデータをクエリします。
SELECT * FROM tbl1; 出力
id | info | crt_time
----+--------------+----------------------------
3 | hello | 2017-04-24 15:31:49.14291
4 | digoal0123 | 2017-04-24 15:42:50.912887
5 | hello digoal | 2017-04-24 15:57:29.622045
1 | new1 | 2017-04-24 15:58:55.610072
2 | new2 | 2017-04-24 15:28:20.37392
6 | new6 | 2017-04-24 15:59:12.265915
(6 rows)複数のデータレコードを一度に削除する
一度にテーブルデータの一部を削除する
サンプル文
-- 複数のデータレコードを一度に削除します。 DELETE FROM tbl1 USING (VALUES (3),(4),(5)) AS tmp(id) WHERE tbl1.id=tmp.id; -- テーブルデータをクエリします。 SELECT * FROM tbl1;出力
id | info | crt_time ----+---------+---------------------------- 1 | new1 | 2017-04-24 15:58:55.610072 2 | new2 | 2017-04-24 15:28:20.37392 6 | new6 | 2017-04-24 15:59:12.265915
すべてのテーブルデータを削除する。TRUNCATE 文を使用することをお勧めします。
サンプル文
-- ロック タイムアウト期間を設定します。 SET lock_timeout = '1s'; -- tbl1 テーブルのすべてのデータを削除します。 TRUNCATE tbl1; -- テーブルデータをクエリします。 SELECT * FROM tbl1;出力
id | info | crt_time ----+------+---------- (0 rows)