PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да върна оригиналния ред в Postgres при нарушаване на уникално ограничение

Това всъщност не е възможно да се направи в една заявка, ще трябва да използвате функция, за да проверите оригиналния ред, че това е точно това, което правите тогава в Python. Можете да видите повече информация в документацията за postgresql

Ако искате да изпълните поведението на желанието в postgresql вместо в Python, можете да направите функция pgplsql, да прихванете изключението и да направите SELECT изявление (някои въпроси, свързани с това решение:това и това )

Редактиране Това може да е алтернативното 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;

След това в Python можете да извикате функцията по следния начин:

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

Можете да приемете това като валиден отговор, ако е полезно




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Таблица за SQL сортиране, базирана на две взаимозаменяеми полета

  2. група по дата агрегатна функция в postgresql

  3. Как да изхвърлите данните за голям обект от Postgres 9.4 и след това да ги импортирате в Postgres8.x?

  4. Управление на високата наличност на PostgreSQL – Част I:Автоматично отказване на PostgreSQL

  5. Динамична заявка в тригерна функция в PostgreSQL