Ini.
Anda dapat memperbarui kolom dari baris atau jenis catatan di plpgsql - seperti yang Anda miliki. Seharusnya berhasil, jelas?
Ini akan memperbarui tabel yang mendasarinya, tentu saja, bukan variabelnya!
UPDATE my_table SET date=now() WHERE id='1';
Anda membingungkan dua hal di sini ...
Jawaban klarifikasi di komentar
Saya tidak berpikir ada sintaks di PostgreSQL yang dapat UPDATE
seluruh baris. Anda dapat UPDATE
daftar kolom
, meskipun. Pertimbangkan demo ini:
Perhatikan bagaimana saya menggunakan thedate
bukannya thedate
sebagai nama kolom, thedate
adalah kata yang dicadangkan
di setiap standar SQL dan nama tipe di 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;
Namun, Anda dapat INSERT
satu baris penuh
dengan mudah. Hanya saja, jangan berikan daftar kolom untuk tabel (yang biasanya Anda harus lakukan, tetapi dalam kasus ini tidak apa-apa, bukan).
Sebagai UPDATE
secara internal adalah DELETE
diikuti dengan INSERT
lagi pula, dan suatu fungsi secara otomatis merangkum semua yang ada dalam suatu transaksi, saya tidak mengerti, mengapa Anda tidak dapat menggunakan ini sebagai gantinya:
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$;