sql >> Databáze >  >> RDS >> PostgreSQL

Jak vrátit původní řádek v Postgresu při porušení jedinečného omezení

To vlastně není možné udělat v jednom dotazu, budete muset použít funkci pro kontrolu původního řádku, že je to přesně to, co děláte v Pythonu. Další informace naleznete v dokumentaci postgresql

Pokud chcete provést chování přání v postgresql místo Pythonu, můžete provést funkci pgplsql, zachytit výjimku a provést SELECT prohlášení (některé otázky související s tímto řešením:toto a toto )

Upravit Toto by mohlo být alternativní řešení 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;

Pak v pythonu můžete funkci zavolat takto:

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

Můžete to přijmout jako platnou odpověď, pokud je to užitečné




  1. Jaké jsou rozdíly mezi datovými typy BLOB a TEXT v MySQL?

  2. vložit a aktualizovat uloženou procedurou

  3. Spusťte SCRIPT z PL/SQL Block

  4. SQL Server příkaz k zálohování příkazového řádku