sql >> Database >  >> RDS >> PostgreSQL

Hoe de originele rij in Postgres te retourneren bij het overtreden van een unieke beperking

Dit is eigenlijk niet mogelijk om in een enkele query te doen, je moet een functie gebruiken om de originele rij te controleren, dat het precies is wat je doet in Python. U kunt meer informatie vinden in de postgresql-documentatie

Als u het wensgedrag in postgresql in plaats van Python wilt uitvoeren, kunt u een pgplsql-functie uitvoeren, de uitzondering opvangen en de SELECT uitvoeren verklaring (enkele vragen met betrekking tot deze oplossing:dit en dit )

Bewerken Dit zou de alternatieve pgplsql-oplossing kunnen zijn:

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;

Dan kun je in python de functie als volgt aanroepen:

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

U kunt dit als een geldig antwoord accepteren als het nuttig is




  1. MySQL:selecteer de dichtstbijzijnde match?

  2. Hoe selecteer je een herhaalbaar willekeurig getal met setseed in postgres sql?

  3. DDL- en DML-instructies in één script combineren

  4. hoe de MYSQL-query-update op deze manier af te handelen