sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL - Returnera radinnehållet när UPPDATERING misslyckas

Ett alternativ för att fortsätta använda uppdatering och fortfarande returnera de motstridiga raderna skulle vara att skapa en funktion som gör denna kontroll innan du utför uppdateringen. Om primärnyckeln redan finns returnerar den den motstridiga raden, och om inte, uppdateras raden. Ett exempel på en sådan funktion kan vara:

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

REDIGERA :Om det inte finns någon konflikt och du fortfarande vill ha RETURNING * , lägg bara till en RETURN QUERY till UPDATE uttalande:

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



  1. Ställa in Identity på eller av i SQL-servern

  2. Flask-SQLAlchemy - När skapas och förstörs tabellerna/databaserna?

  3. SQL För att kontrollera om rummet är ledigt mellan datumen

  4. samla in årliga aggregerade data för senare snabb åtkomst