sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man returnerar den ursprungliga raden i Postgres vid överträdelse av en unik begränsning

Detta är faktiskt inte möjligt att göra i en enda fråga, du måste använda en funktion för att kontrollera den ursprungliga raden, att det är exakt vad du gör då i Python. Du kan se mer information i postgresql-dokumentationen

Om du vill utföra önskebeteendet i postgresql istället för Python kan du göra en pgplsql-funktion, fånga undantaget och göra SELECT uttalande (några frågor relaterade till den här lösningen:detta och detta )

Redigera Detta kan vara den alternativa pgplsql-lösningen:

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;

Sedan i python kan du anropa funktionen så här:

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

Du kan acceptera detta som ett giltigt svar om det är användbart




  1. Slå samman och uppdatera primärnyckeln

  2. ta bort information från mysql-tabellen när användaren stänger sin webbläsare

  3. Callablestatement fel:Saknas IN eller OUT parameter vid index::1

  4. Vad är skillnaden mellan setTime(...) och setTimestamp(...) i Hibernate Query?