PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment retourner la ligne d'origine dans Postgres en cas de violation d'une contrainte unique

Ce n'est en fait pas possible de le faire dans une seule requête, vous devrez utiliser une fonction pour vérifier la ligne d'origine, que c'est exactement ce que vous faites alors en Python. Vous pouvez voir plus d'informations dans la documentation postgresql

Si vous voulez effectuer le comportement de souhait dans postgresql au lieu de Python, vous pouvez faire une fonction pgplsql, intercepter l'exception et faire le SELECT déclaration (quelques questions liées à cette solution :ceci et ceci )

Modifier Cela pourrait être la solution alternative 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;

Ensuite, en python, vous pouvez appeler la fonction comme ceci :

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

Vous pouvez accepter ceci comme une réponse valide si c'est utile