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

PostgreSQL - Zwróć zawartość wiersza, gdy UPDATE nie powiedzie się

Jedną z opcji dalszego używania aktualizacji i zwracania konfliktów wierszy byłoby utworzenie funkcji, która wykona to sprawdzenie przed wykonaniem aktualizacji. Jeśli klucz podstawowy już istnieje, zwraca wiersz powodujący konflikt, a jeśli nie, wiersz jest aktualizowany. Przykładem takiej funkcji może być:

CREATE OR REPLACE FUNCTION my_func(cont TEXT, lang INT, idp TEXT) 
RETURNS SETOF sentence AS $$
DECLARE j RECORD;
BEGIN
  SELECT * FROM sentence WHERE content = cont AND 
                               language_id = lang INTO j;
  IF j IS NOT NULL THEN 
    RETURN NEXT j;
  ELSE
    RETURN QUERY UPDATE sentence SET content = cont, language_id= lang 
                 WHERE id = idp RETURNING *;
  END IF;
  EXCEPTION WHEN SQLSTATE '23505' THEN 
  RETURN QUERY SELECT * FROM sentence WHERE content = cont AND
                                            language_id= lang;
END$$ LANGUAGE plpgsql;

SELECT my_func('This is a sentence',834,'0538f24a-2046-4da6-933d-409aa7b7c597');

EDYTUJ :Jeśli nie ma konfliktu i nadal chcesz RETURNING * , po prostu dodaj RETURN QUERY do UPDATE oświadczenie:

...    
RETURN QUERY 
UPDATE sentence SET content = cont, language_id= lang WHERE id = idp 
RETURNING *;
...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytanie Postgresql do aktualizacji pól za pomocą wyrażenia regularnego

  2. NHibernate Postgresql DateTime do konwersji czasu

  3. Czy można użyć pandas/sqlalchemy do wstawiania tablic do bazy danych sql? (postgres)

  4. Jak zapisać nowego użytkownika do powiadomień?

  5. Błąd bazy danych Postgres:relacja nie istnieje