我想知道是否可以直接更新“my_row”记录。
这是。
您可以在 plpgsql 中更新行或记录类型的列 - 就像您拥有它一样。它应该工作,显然?
当然,这将更新基础表,而不是变量!
UPDATE my_table SET date=now() WHERE id='1';
你在这里混淆了两件事......
在评论中回答澄清
我认为 PostgreSQL 中没有可以UPDATE
整行的语法。不过,您可以UPDATE
列 list。考虑这个演示:
请注意我如何使用thedate
而不是date
列名,date
它是每个 SQL 标准中的保留字和 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;
但是,您可以轻松地INSERT
整行。只是不要为表格提供列列表(您通常应该这样做,但在这种情况下完全可以,不要这样做)。
因为 anUPDATE
在内部是 aDELETE
后面跟着 an INSERT
,并且函数会自动将所有内容封装在事务中,我不明白为什么你不能使用它:
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$;