PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak zwrócić oryginalny wiersz w Postgresie po naruszeniu unikalnego ograniczenia?

W rzeczywistości nie jest to możliwe do wykonania w jednym zapytaniu, będziesz musiał użyć funkcji, aby sprawdzić oryginalny wiersz, czy jest to dokładnie to, co robisz w Pythonie. Więcej informacji znajdziesz w dokumentacji postgresql

Jeśli chcesz wykonać zachowanie życzeń w postgresql zamiast w Pythonie, możesz wykonać funkcję pgplsql, złapać wyjątek i wykonać SELECT oświadczenie (kilka pytań związanych z tym rozwiązaniem:to i to )

Edytuj To może być alternatywne rozwiązanie 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;

Następnie w Pythonie możesz wywołać funkcję w ten sposób:

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

Możesz zaakceptować to jako prawidłową odpowiedź, jeśli jest to przydatne




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyjście potoku PostgreSQL COPY do gzip, a następnie do STDOUT

  2. Jak Atan2d() działa w PostgreSQL

  3. Heroku Postgres:To połączenie zostało zamknięte

  4. Różnica między typem danych DECIMAL i NUMERIC w PSQL

  5. Obraz natywny danych Micronaut:nie istnieje bean typu [io.micronaut.data.operations.PrimaryRepositoryOperations]