sql >> Database teknologi >  >> RDS >> PostgreSQL

Sådan returneres den oprindelige række i Postgres ved overtrædelse af en unik begrænsning

Dette er faktisk ikke muligt at gøre i en enkelt forespørgsel, du skal bruge en funktion til at kontrollere den oprindelige række, at det er præcis, hvad du gør dengang i Python. Du kan se flere oplysninger i postgresql-dokumentationen

Hvis du vil udføre ønskeadfærden i postgresql i stedet for Python, kan du lave en pgplsql-funktion, fange undtagelsen og udføre SELECT erklæring (nogle spørgsmål relateret til denne løsning:dette og dette )

Rediger Dette kunne være den alternative pgplsql-løsning:

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;

Så i python kan du kalde funktionen sådan her:

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

Du kan acceptere dette som et gyldigt svar, hvis det er nyttigt




  1. Brug Entity Framework i .net 4.0 med Oracle-database - muligt?

  2. SQLException:Protokolbrud. Oracle JDBC-driver problem

  3. oprettelse af adgangskodefelt i oracle

  4. MySQL 'hvis eksisterer' fejl