すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:複数のデータレコードを一度に挿入、更新、および削除する

最終更新日:Jul 01, 2025

このトピックでは、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)