sql >> Database >  >> RDS >> PostgreSQL

UPDATE een hele rij in PL/pgSQL

Dat is zo.
Je kunt kolommen van een rij of recordtype bijwerken in plpgsql - net zoals je het hebt. Het zou natuurlijk moeten werken?

Dit zou natuurlijk de onderliggende tabel bijwerken, niet de variabele!

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

Je verwart hier twee dingen ...

Antwoord op verduidelijking in opmerking

Ik denk niet dat er een syntaxis in PostgreSQL is die kan UPDATE een hele rij. U kunt UPDATE een kolomlijst , hoewel. Overweeg deze demo:

Let op hoe ik thedate gebruik in plaats van date als kolomnaam, date is een gereserveerd woord in elke SQL-standaard en een typenaam in 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;

U kunt echter INSERT een hele rij gemakkelijk. Geef alleen geen kolomlijst voor de tabel op (wat u normaal gesproken zou moeten doen, maar in dit geval is het prima om dat niet te doen).

Als een UPDATE is intern een DELETE gevolgd door een INSERT hoe dan ook, en een functie kapselt automatisch alles in een transactie in, ik begrijp niet waarom je dit niet in plaats daarvan zou kunnen gebruiken:

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. update gebruikerslijst in groep:UPDATE of DELETE + INSERT

  2. Wat is de juiste standaardwaarde voor een MySQL-decimaalveld?

  3. Hoe LOCATE() werkt in MariaDB

  4. Hoe maak je een index voor elementen van een array in PostgreSQL?