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

AKTUALIZUJTE celý řádek v PL/pgSQL

Je.
Můžete aktualizovat sloupce typu řádku nebo záznamu v plpgsql - stejně jako vy. Mělo by to samozřejmě fungovat?

Tím by se samozřejmě aktualizovala podkladová tabulka, nikoli proměnná!

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

Pletete si zde dvě věci ...

Odpověď na vysvětlení v komentáři

Nemyslím si, že v PostgreSQL existuje syntaxe, která by mohla UPDATE celou řadu. Můžete UPDATE seznam sloupců , ačkoli. Zvažte toto demo:

Všimněte si, jak používám thedate místo date jako název sloupce date je rezervované slovo v každém standardu SQL a název typu v 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;

Můžete však INSERT celý řádek snadno. Jen pro tabulku nezadávejte seznam sloupců (což byste normálně měli, ale v tomto případě je to naprosto v pořádku, ne).

Jako UPDATE je interně DELETE následuje INSERT stejně a funkce automaticky zapouzdří vše v transakci, nechápu, proč byste místo toho nemohli použít toto:

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. SQL dotaz zahrnující skupinu podle a spojení

  2. Spočítejte výskyty DISTINCT hodnot

  3. Nerozpoznané klíčové slovo Near Fields, ukončeno při použití INTO OUTFILE v dotazu mysql

  4. Jak získat řádkovou pozici?