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

AKTUALIZUJ cały wiersz w PL/pgSQL

Jest.
Możesz aktualizować kolumny wiersza lub typu rekordu w plpgsql - tak jak to masz. Oczywiście powinno działać?

To oczywiście zaktualizowałoby tabelę bazową, a nie zmienną!

UPDATE my_table SET date=now() WHERE id='1';

Mylisz tutaj dwie rzeczy...

Odpowiedź na wyjaśnienie w komentarzu

Nie sądzę, że w PostgreSQL istnieje składnia, która może UPDATE cały rząd. Możesz UPDATE lista kolumn , chociaż. Rozważ tę prezentację:

Zwróć uwagę, jak używam thedate zamiast date jako nazwa kolumny, date jest słowem zarezerwowanym w każdym standardzie SQL i nazwę typu w PostgreSQL.

CREATE TEMP TABLE my_table (id serial, thedate date);
INSERT INTO my_table(thedate) VALUES (now());

CREATE OR REPLACE FUNCTION test_up()
  RETURNS void LANGUAGE plpgsql AS
$func$
DECLARE
    _r my_table;
BEGIN
   SELECT * INTO _r FROM my_table WHERE id = 1;
   _r.thedate := now()::date + 5 ;

   UPDATE my_table t
    -- explicit list of columns to be to updated
   SET   (id, thedate) = (_r.id, _r.thedate)
   WHERE  t.id = 1;
END
$func$;

SELECT test_up();
SELECT * FROM my_table;

Możesz jednak INSERT cały rząd z łatwością. Po prostu nie dostarczaj listy kolumn dla tabeli (co normalnie powinieneś, ale w tym przypadku jest całkowicie w porządku, nie).

Jako UPDATE jest wewnętrznie DELETE po którym następuje INSERT w każdym razie, a funkcja automatycznie hermetyzuje wszystko w transakcji, nie rozumiem, dlaczego nie możesz użyć tego zamiast tego:

CREATE OR REPLACE FUNCTION x.test_ delins()
  RETURNS void LANGUAGE plpgsql AS
$func$
DECLARE
    _r my_table;
BEGIN
   SELECT * INTO _r
   FROM my_table WHERE id = 1;
   _r.thedate := now()::date + 10;

   DELETE FROM my_table t WHERE t.id = 1;
   INSERT INTO my_table SELECT _r.*;
END
$func$;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak modelować pakiety, wersje i licencje?

  2. XMLTABLE w PostgreSQL

  3. Generuj wartości DOMYŚLNE w CTE UPSERT przy użyciu PostgreSQL 9.3

  4. Funkcje okna PostgreSQL ignorują wartości Null

  5. Jak sprawdzić, czy długi lat mieści się w granicach miasta?