gpt4 book ai didi

postgresql - 在 PL/pgSQL 中更新整行

转载 作者:行者123 更新时间:2023-11-29 11:32:57 24 4
gpt4 key购买 nike

我有 plpgsql 函数:

CREATE OR REPLACE FUNCTION test() RETURNS VOID AS
$$
DECLARE
my_row my_table%ROWTYPE;
BEGIN
SELECT * INTO my_row FROM my_table WHERE id='1';
my_row.date := now();
END;
$$ LANGUAGE plpgsql;

我想知道是否可以直接更新 my_row 记录。

我现在找到的唯一方法是:

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

请注意,这只是一个示例函数,真正的函数远比这复杂。

我正在使用 PostgreSQL 9.2。

更新:

对不起,我想说的是:

SELECT * INTO my_row FROM my_table INTO my_row WHERE id='1';
make_lots_of_complicated_modifications_to(my_row, other_complex_parameters);
UPDATE my_row;

即使用 my_row 将信息保存在基础表中。我有很多参数要更新。

最佳答案

I would like to know if it's possible to directly update "my_row" record.

是的。
您可以在 plpgsql 中更新行或记录类型的列 - 就像您拥有它一样。显然,它应该有效?

这会更新基础表,当然不是变量!

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

你在这里混淆了两件事......


评论中对澄清的回答

我认为 PostgreSQL 中没有语法可以 UPDATE 整行。你可以UPDATE a column list , 尽管。考虑这个演示:

请注意我是如何使用 thedate 而不是 date 作为列名的,date 是一个 reserved word在每个 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
<b>SET (id, thedate) = (_r.id, _r.thedate)</b>
WHERE t.id = 1;
END
$func$;

SELECT test_up();
SELECT * FROM my_table;

但是,您可以 INSERT a whole row 轻松。只是不要为表提供列列表(您通常应该这样做,但在这种情况下完全没问题,不用)。

由于 UPDATE 在内部是一个 DELETE 后跟一个 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;
<b>INSERT INTO my_table SELECT _r.*;</b>
END
$func$;

关于postgresql - 在 PL/pgSQL 中更新整行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12528981/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com