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

一意の制約に違反したときにPostgresで元の行を返す方法

    これは実際には単一のクエリでは実行できません。関数を使用して元の行をチェックする必要があります。これは、Pythonで実行していることとまったく同じです。詳細については、postgresqlのドキュメントをご覧ください。

    Pythonではなくpostgresqlでwish動作を実行する場合は、pgplsql関数を実行し、例外をキャッチして、SELECTを実行できます。 ステートメント(このソリューションに関連するいくつかの質問:これ およびこれ )

    編集 これは、代替のpgplsqlソリューションである可能性があります:

    CREATE OR REPLACE FUNCTION udf_insert_row(
        param_email varchar)
      RETURNS integer AS
    $BODY$
    
    DECLARE
        result integer;
    
    BEGIN
      /*
      -- To Test:
        SELECT udf_insert_row('[email protected]'); will return 1
        SELECT udf_insert_row('[email protected]'); will return 2
        SELECT udf_insert_row('[email protected]'); will return 1
      */
    
      BEGIN
          INSERT INTO your_table(
            email
            ) 
          VALUES (
            param_email
          ) RETURNING id INTO result;
      EXCEPTION WHEN unique_violation THEN
          SELECT 
            id INTO STRICT result
          FROM 
            your_table 
          WHERE 
            email = param_email;
      END;  
    
        RETURN result;
    
    END;
    
    $BODY$
      LANGUAGE plpgsql VOLATILE
      COST 100;
    ALTER FUNCTION udf_insert_row(varchar)
      OWNER TO postgres;
    

    次に、Pythonでは、次のような関数を呼び出すことができます。

    pgcur.execute("BEGIN")
    args = ["[email protected]"]
    pgcur.callproc("udf_insert_row",args)
    result = pgcur.fetchone()
    pgcur.execute("COMMIT")
    

    役に立つ場合は、これを有効な回答として受け入れることができます




    1. 2番目の列の値に従って、一意の行を選択します

    2. SQL Serverはデータを分割する必要がありますが、StandardEditionのみがあります

    3. SQLクエリを使用して連続番号を選択する

    4. エラー:ライブラリ「/opt/PostgreSQL/9.0/lib/postgresql/plperl.so」を読み込めませんでした:libperl.so: