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

更新可能なビューのCHECK句

    ジュゼッペブロッコロ著

    PostgreSQL 9.3以降、ビューが1つの基になるテーブルのみを参照している限り、ビューを直接更新して挿入することができます。

    PostgreSQL 9.4では、更新可能なビューへのINSERTにCHECK句を使用できます。たとえば、1つの整数列だけで構成されるテーブルについて考えてみます。 2つのビューを検討します。1つは2で割り切れる数で、もう1つは3で割り切れる数です。最初のビューに123という数を挿入しようとすると、次のようになります。

    -

    $ CREATE TABLE some_data(id int4 PRIMARY KEY);

    テーブルの作成

    $ CREATE VIEW first AS SELECT * FROM some_data WHERE 0 =id%2;

    ビューの作成

    $ CREATE VIEW second AS SELECT * FROM some_data WHERE 0 =id%3;

    ビューの作成

    $ INSERT INTO first(id)VALUES(123);

    -

    ビューは2で割り切れる数値のみですが、基になるテーブルに挿入されます(したがって、新しい値はビューに表示されません)。 PostgreSQL 9.4では、値がビューの定義と互換性があることを事前にチェックすることにより、ビューへのINSERTを適切に管理するためのCHECK句が導入されました。

    2つの可能なオプションがあります:

    *カスケードチェック–これはデフォルトのオプションであり、チェックは同じ基になるテーブルで定義された他のビューにカスケードされます

    *ローカルチェック–INSERTのターゲットであるビューのみがチェックされます

    ここでは、上記の例でCHECK句を使用する方法を示します。

    -

    $最初にビューをドロップします;

    ドロップビュー

    $ DROP VIEW second;

    ドロップビュー

    $ CREATE VIEW first AS SELECT * FROM some_data WHERE 0 =id%2 WITH CHECK OPTION;

    ビューの作成

    $ CREATE VIEW second AS SELECT * FROM some_data WHERE 0 =id%3 WITH CHECK OPTION;

    ビューの作成

    $ CREATE VIEW third AS SELECT * FROM first WHERE 0 =id%3 WITH CHECK OPTION;

    ビューの作成

    $ INSERT INTO first(id)VALUES(14);

    INSERT 0 1

    $ INSERT INTO first(id)VALUES(15);

    エラー:新しい行が「最初の」ビューのWITHCHECKOPTIONに違反しています

    $ INSERT INTO second(id)VALUES(15);

    INSERT 0 1

    $ INSERT INTO third(id)VALUES(6);

    INSERT 0 1

    $ INSERT INTO third(id)VALUES(15);

    エラー:新しい行が「最初の」ビューのWITHCHECKOPTIONに違反しています

    ビュー「3番目」はビュー「最初」で定義されていることに注意してください。

    値「14」は最初のビューに正しく挿入されますが、値「15」は、予想どおり、最初ではなく2番目にのみ挿入できます。 3と2の両方で割り切れるので、3番目のビューに「6」を挿入できます。3で割り切れるのに「15」を3番目のビューに挿入する際のエラーは、2で割り切れるCHECK句に違反しているためです。最初に、親ビューで。この場合、問題を回避するには、両方のビューでLOCALCHECK句を使用するだけでは不十分です。

    -

    $最初にビューをドロップします;

    ドロップビュー

    $ DROPVIEW3番目;

    ドロップビュー

    $ CREATE VIEW first AS SELECT * FROM some_data WHERE 0 =id%2 WITH LOCAL CHECK OPTION;

    ビューの作成

    $ CREATE VIEW third AS SELECT * FROM first WHERE 0 =id%3 WITH LOCAL CHECK OPTION;

    ビューの作成

    $ INSERT INTO third(id)VALUES(15);

    エラー:新しい行が「最初の」ビューのWITHCHECKOPTIONに違反しています

    -

    実例を次に示します:

    -

    $最初にビューをドロップします;

    ドロップビュー

    $ DROPVIEW3番目;

    ドロップビュー

    $ CREATE VIEW first AS SELECT * FROM some_data WHERE 0 =id%2;

    ビューの作成

    $ CREATE VIEW third AS SELECT * FROM first WHERE 0 =id%3 WITH LOCAL CHECK OPTION;

    ビューの作成

    $ INSERT INTO third(id)VALUES(15);

    INSERT 0 1

    -

    結論

    この新しいチェックメカニズムは、INSERTフェーズ中に更新可能なビューに直接適用できます。これにより、データの整合性を維持する上でのデータベースの役割がますます強化されます。


    1. EnterpriseEditionでNOEXPANDヒントを使用するもう1つの理由

    2. AWSRDSでのMySQLデータベースおよびOracleデータベースでのJDeveloperの使用パート3

    3. SQLServer2017のインストール

    4. Androidでsqliteデータベースを使用してテーブルを作成するにはどうすればよいですか?