在PL / pgSQL中更新整行

Jer*_*oni 4 postgresql plpgsql sql-update

我有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;
Run Code Online (Sandbox Code Playgroud)

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

我现在发现要做的唯一方法是:

UPDATE my_table SET date=now() WHERE id='1';
Run Code Online (Sandbox Code Playgroud)

请注意,这只是一个示例函数,实际的函数要比这复杂得多。

我正在使用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;
Run Code Online (Sandbox Code Playgroud)

即使用my_ row将信息保留在基础表中。我有很多参数需要更新。

Erw*_*ter 6

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

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

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

UPDATE my_table SET date=now() WHERE id='1';
Run Code Online (Sandbox Code Playgroud)

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


在评论中澄清问题的答案

我认为PostgreSQL中没有语法可以UPDATE整行。不过,您可以UPDATE列列表。考虑这个演示:

请注意,我如何使用它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;
Run Code Online (Sandbox Code Playgroud)

但是,您可以轻松INSERT整行。只是不提供该表的列列表(通常应该这样做,但是在这种情况下,完全可以,不这样做)。

由于在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;
   INSERT INTO my_table SELECT _r.*;
END
$func$;
Run Code Online (Sandbox Code Playgroud)

  • Erwin ...似乎delete / insert方法的问题是外键问题。您将如何解决这些问题? (2认同)