sql >> データベース >  >> RDS >> PostgreSQL

PostreSQLに新しい行のみを一括挿入する方法

    データのインポート

    コピー 一時的なステージングテーブルへのすべて 新しいタイトルのみをターゲットテーブルに挿入します。

    CREATE TEMP TABLE tmp(title text);
    
    COPY tmp FROM 'path/to/file.csv';
    ANALYZE tmp;
    
    INSERT INTO tbl
    SELECT DISTINCT tmp.title
    FROM   tmp 
    LEFT   JOIN tbl USING (title)
    WHERE  tbl.title IS NULL;
    

    IDは、 serialを使用して自動的に生成する必要があります 列tbl_id tblで 。

    LEFT JOIN / IS NULL コンストラクトは、既存のタイトルを失格にします。 存在しません 別の可能性があります。

    DISTINCT 一時テーブルtmpの受信データの重複を防ぎます 。

    ANALYZE クエリプランナーが適切なプランを選択し、一時テーブルが自動バキュームによって分析されないようにするのに役立ちます。

    300万個のアイテムがあるので、 temp_bufferの設定を上げるとお金がかかる場合があります (このセッションのみ ):

    SET temp_buffers = 1000MB;
    

    または、いくら余裕があり、一時テーブルをRAMに保持するのに十分であり、はるかに高速です。注:最初に実行する必要があります セッション中-一時オブジェクトが作成される前。

    IDを取得する

    インポートされたデータのすべてのIDを表示するには:

    SELECT tbl.tbl_id, tbl.title
    FROM   tbl
    JOIN   tmp USING (title)
    

    同じセッションで!一時テーブルは、セッションの終了時に自動的に削除されます。




    1. PostgreSQLの特定のスキーマのデータベースに保存されているすべての関数のリストを取得するにはどうすればよいですか?

    2. Oracle JDeveloperでのJavaアプリケーションの作成、パート2

    3. MySQLのツリー構造テーブルを1回のクエリで任意の深さまでクエリすることは可能ですか?

    4. ADO.NETがT-SQLストアドプロシージャを呼び出すと、SqlTimeoutExceptionが発生します