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

トランザクションでアップサート

    この単純なテーブルを想定すると:

    CREATE TABLE tbl(id int primary key, value int);
    

    この関数はほぼ 同時トランザクションに対して100%安全(コメントを参照)。:

    CREATE OR REPLACE FUNCTION f_upsert(_id int, _value int)
      RETURNS void AS
    $func$
    BEGIN
    LOOP
       UPDATE tbl SET value = _value WHERE  id = _id;
    
       EXIT WHEN FOUND;
    
       BEGIN
          INSERT INTO tbl (id, value)
          VALUES (_id, _value);
    
          RETURN;
    
       EXCEPTION WHEN UNIQUE_VIOLATION THEN     -- tbl.id has UNIQUE constraint.
          RAISE NOTICE 'It actually happened!'; -- hardly ever happens
       END;
    
    END LOOP;
    END
    $func$ LANGUAGE plpgsql;
    

    電話:

    SELECT f_upsert(2, 2);
    

    これは、このINSERT / SELECTと非常によく似ています。 詳細な説明とリンクのあるケース:

    • 関数内のSELECTまたはINSERTは競合状態になりやすいですか?



    1. どのデータマスキング機能を使用する必要がありますか?

    2. Postgres UTC日付形式とエポックキャスト、符号反転

    3. NoSQLにおけるDBAの役割

    4. SQLServerの既存の列にIDプロパティを追加するにはどうすればよいですか