sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL - Vrátí obsah řádku, když UPDATE selže

Jednou z možností, jak pokračovat v používání aktualizace a stále vracet konfliktní řádky, by bylo vytvořit funkci, která tuto kontrolu provede před provedením aktualizace. V případě, že primární klíč již existuje, vrátí konfliktní řádek, a pokud ne, řádek se aktualizuje. Příkladem takové funkce může být:

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');

UPRAVIT :Pokud nedochází ke konfliktu a přesto chcete RETURNING * , stačí přidat RETURN QUERY do UPDATE prohlášení:

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



  1. Poddotaz MySQL s hlavní datovou proměnnou dotazu

  2. GROUP_CONCAT více polí s jiným oddělovačem

  3. SQL Server Query:Rychlý s doslovným, ale pomalý s proměnným

  4. SQL SELECT MAX