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

PostgreSQL-UPDATEが失敗したときに行の内容を返します

    更新を引き続き使用し、競合する行を返す1つのオプションは、更新を実行する前にこのチェックを実行する関数を作成することです。主キーがすでに存在する場合は、競合する行を返します。存在しない場合は、行が更新されます。このような関数の例は次のとおりです。

    CREATE OR REPLACE FUNCTION my_func(cont TEXT, lang INT, idp TEXT) 
    RETURNS SETOF sentence AS $$
    DECLARE j RECORD;
    BEGIN
      SELECT * FROM sentence WHERE content = cont AND 
                                   language_id = lang INTO j;
      IF j IS NOT NULL THEN 
        RETURN NEXT j;
      ELSE
        RETURN QUERY UPDATE sentence SET content = cont, language_id= lang 
                     WHERE id = idp RETURNING *;
      END IF;
      EXCEPTION WHEN SQLSTATE '23505' THEN 
      RETURN QUERY SELECT * FROM sentence WHERE content = cont AND
                                                language_id= lang;
    END$$ LANGUAGE plpgsql;
    
    SELECT my_func('This is a sentence',834,'0538f24a-2046-4da6-933d-409aa7b7c597');
    

    編集 :競合がなく、それでもRETURNING *が必要な場合 、RETURN QUERYを追加するだけです UPDATEへ ステートメント:

    ...    
    RETURN QUERY 
    UPDATE sentence SET content = cont, language_id= lang WHERE id = idp 
    RETURNING *;
    ...
    



    1. カンマ区切りの値を持つ単一のMySQLフィールド

    2. 親列の値に依存する複合一意性制約を適用します

    3. PyPy、Django、PostgreSQLをどのように連携させるのですか?

    4. XMLで類似のタグを連結する方法