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

PostgreSQLIFステートメント

    DO
    $do$
    BEGIN
       IF EXISTS (SELECT FROM orders) THEN
          DELETE FROM orders;
       ELSE
          INSERT INTO orders VALUES (1,2,3);
       END IF;
    END
    $do$
    

    標準SQLには手続き型要素はありません。 IF ステートメントは、デフォルトの手続き型言語PL/pgSQLの一部です。 DOを使用して、関数を作成するか、アドホックステートメントを実行する必要があります コマンド。

    セミコロンが必要です(; )plpgsqlの各ステートメントの最後(最後のENDを除く) 。

    END IF;が必要です IFの最後に ステートメント。

    副選択は括弧で囲む必要があります:

        IF (SELECT count(*) FROM orders) > 0 ...
    

    または:

        IF (SELECT count(*) > 0 FROM orders) ...
    

    ただし、これは同等ではるかに高速です:

        IF EXISTS (SELECT FROM orders) ...
    

    代替

    追加のSELECT 必要ありません。これは同じことをより速く行います:

    DO
    $do$
    BEGIN
       DELETE FROM orders;
       IF NOT FOUND THEN
          INSERT INTO orders VALUES (1,2,3);
       END IF;
    END
    $do$
    

    可能性は低いですが、同じテーブルへの同時トランザクションの書き込みが干渉する可能性があります。確実に、デモのように続行する前に、同じトランザクションでテーブルを書き込みロックします。



    1. django.db.utils.ProgrammingError:関係はすでに存在します

    2. org.postgresql.util.PSQLException:ラージオブジェクトは自動コミットモードでは使用できません

    3. MariaDBでのSECOND()のしくみ

    4. データベーストリガーが気に入らないですか?あなたは彼らと一緒に働く方法を知らないだけです!