sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo devolver la fila original en Postgres al violar una restricción única

En realidad, esto no es posible hacerlo en una sola consulta, deberá usar una función para verificar la fila original, que es exactamente lo que está haciendo en Python. Puede ver más información en la documentación de postgresql

Si desea realizar el comportamiento deseado en postgresql en lugar de Python, puede hacer una función pgplsql, capturar la excepción y hacer SELECT declaración (algunas preguntas relacionadas con esta solución:this y esto )

Editar Esta podría ser la solución pgplsql alternativa:

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;

Luego, en python, puede llamar a la función de esta manera:

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

Puede aceptar esto como una respuesta válida si es útil