このトピックでは、ApsaraDB RDS for PostgreSQLインスタンスの複数のデータレコードを一度に挿入、更新、および削除する方法について説明します。 これらの操作により、RDSインスタンスとアプリケーション間のやり取りの数が減り、RDSインスタンスのデータ処理能力が向上します。
一度に複数のデータレコードを挿入
次のいずれかの方法を使用して、一度に複数のデータレコードを挿入できます。
この例では、次のステートメントを使用して、tbl1という名前のテストテーブルを作成します。
テーブルtbl1の作成 (
idシリアル基本キー、
情報テキスト、
crt_timeタイムスタンプ
);
方法1: INSERT INTO... を実行する SELECTステートメント。
サンプル文
-- 複数のデータレコードをtbl1テーブルに一度に挿入します。 INSERT INTO tbl1 (id, info ,crt_time) SELECT GENERATE_SERIES(1,10000) 、'test' 、NOW(); -- データボリュームを照会します。 選択カウント (*) からtbl1;
Output
カウント ------- 10000 (1行)
方法2: VALUES() 、() 、...(); 関数を使用する。
サンプル文
-- 複数のデータレコードをtbl1テーブルに一度に挿入します。 INSERT INTO tbl1 (id,info,crt_time) 値 (1,'test',NOW()), (2,'test2',NOW()), (3,'test3',NOW()); -- データボリュームを照会します。 選択カウント (*) からtbl1;
Output
カウント ------- 3 (1行)
方法3: BEGINを実行する。複数のINSERTステートメント...; END; トランザクション。
説明
このメソッドを使用すると、1つのトランザクションに複数のINSERTステートメントを含めることができます。 これにより、トランザクションコミット時の待機時間が短縮され、RDSインスタンスのパフォーマンスが向上します。
サンプル文
-- 複数のデータレコードをtbl1テーブルに一度に挿入します。 開始; INSERT INTO tbl1 (id,info,crt_time) 値 (1,'test',NOW()); INSERT INTO tbl1 (id,info,crt_time) 値 (2,'test2',NOW()); INSERT INTO tbl1 (id,info,crt_time) 値 (3,'test3',NOW()); エンド; -- データボリュームを照会します。 選択カウント (*) からtbl1;
Output
カウント ------- 3 (1行)
方法4: COPYコマンドを使用します。
説明
COPYコマンドは、INSERT文と比較して使いやすく、データを挿入する効率が高くなります。
サンプル文
− 標準入力ストリームからデータを読み取り、データをtbl1テーブルにコピーする。 COPY tbl1からstdin; -- 最初のデータレコードを入力します。 1 'テスト' '2023-01-01' -- 2番目のデータレコードを入力します。 2 'テスト1' 2023-02-02' -終了 \. -- データボリュームを照会します。 選択カウント (*) からtbl1;
Output
カウント ------- 2 (1行)
説明使用可能なCOPY関数は、使用する言語ドライバーによって異なります。 詳細については、次のドキュメントをご参照ください。
一度に複数のデータレコードを更新する
サンプル文
-- 一度に複数のデータレコードを更新します。
UPDATE tbl1 SET inf o=tmp.info from (VALUES (1,'new1'),(2,'new2'),(6,'new6')) AS tmp (id,info) WHERE tbl1.id=tmp.id;
-- テーブルデータを照会します。
SELECT * からtbl1;
Output
id | info | crt_time
---- -------------- ----------------------------
3 | こんにちは | 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行)
一度に複数のデータレコードを削除する
一度に部分的なテーブルデータを削除する
サンプル文
-- 一度に複数のデータレコードを削除します。 tbl1の使用から削除 (値 (3) 、(4) 、(5)) AS tmp(id) WHERE tbl1.id=tmp.id; -- テーブルデータを照会します。 SELECT * からtbl1;
Output
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テーブル内のすべてのデータを削除します。 トランケートtbl1; -- テーブルデータを照会します。 SELECT * からtbl1;
Output
id | info | crt_time ---- ------ ------------- (0行)