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

PostgreSQLの部分的な一意のインデックスとアップサート

    複数の部分インデックスを競合ターゲットとして使用することはできないと思います。単一のインデックスを使用して、目的の動作を実現するようにしてください。私が見ることができる唯一の方法は、式に一意のインデックスを使用することです:

    drop table if exists test;
    create table test (
        p text not null,
        q text,
        r text,
        txt text
    );
    
    create unique index test_unique_idx on test (p, coalesce(q, ''), coalesce(r, ''));
    

    これで、3つのテストすべて(2回実行)が同じインデックスに違反します:

    insert into test(p,q,r,txt) values ('p',null,null,'a'); -- violates test_unique_idx
    insert into test(p,q,r,txt) values ('p','q',null,'b');  -- violates test_unique_idx
    insert into test(p,q,r,txt) values ('p',null, 'r','c'); -- violates test_unique_idx
    

    挿入コマンドでは、インデックス定義で使用されている式を渡す必要があります。

    insert into test as u (p,q,r,txt) 
    values ('p',null,'r','d') 
    on conflict (p, coalesce(q, ''), coalesce(r, '')) do update 
    set txt = excluded.txt;
    



    1. SQLのmongodb変換INSERT...SELECT

    2. SP_WhoIsActiveまたはFogLightを介してSQLデータベースを監視する| SQLServerのパフォーマンスのトラブルシューティング-1

    3. MuleSoftがGraphQLを採用してAPI統合を推進

    4. Python:_mysqlとMySQLdbの長所と短所は?