sql >> データベース >  >> RDS >> PostgreSQL

PL/pgSQLの行全体を更新します


    plpgsqlで行またはレコードタイプの列を更新できます-あなたが持っているのと同じように。明らかに機能しているはずですか?

    もちろん、これにより、変数ではなく、基になるテーブルが更新されます!

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

    ここで2つのことを混同しています...

    コメントでの説明への回答

    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;
    

    ただし、 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$;
    


    1. 一般的なエラーを解決する方法:2006MySQLサーバーがなくなりました

    2. PHP PDO:bindValue()と予約キーワードを処理する方法は?

    3. OracleXMLTypeを使用する場合のnullの処理

    4. djangoでのsqliteからpostgresqlへの移行