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

ビューにnull以外の列を作成する方法

    非ヌルまたはチェック制約をビューに追加することはできません。これと同じページの「NOTNULL制約の制限」と「チェック制約の制限」を参照してください。 チェックオプション付きを追加できます (冗長なwhere句に対して)ビューに追加されますが、 not nullとしてマークされません データディクショナリで。

    この効果を得るために私が考えることができる唯一の方法は、11gを使用している場合、キャスト値をテーブルの仮想列として追加し、(まだ必要な場合は)それに対してビューを作成することです。

    ALTER TABLE "MyTable" ADD "MyBDColumn" AS
        (CAST("MyColumn" AS BINARY_DOUBLE)) NOT NULL;
    
    CREATE OR REPLACE VIEW "MyView" AS
    SELECT
        "MyBDColumn" AS "MyColumn"
    FROM "MyTable";
    
    desc "MyView"
    
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     MyColumn                                  NOT NULL BINARY_DOUBLE
    

    dba.seのコメントで、これは何かをモックアップするためのものであると述べたので、通常の列とトリガーを使用して仮想列をシミュレートできます。

    CREATE TABLE "MyTable" 
    (
      "MyColumn" NUMBER NOT NULL,
      "MyBDColumn" BINARY_DOUBLE NOT NULL
    );
    
    CREATE TRIGGER "MyTrigger" before update or insert on "MyTable"
    FOR EACH ROW
    BEGIN
        :new."MyBDColumn" := :new."MyColumn";
    END;
    /
    
    CREATE VIEW "MyView" AS
    SELECT
        "MyBDColumn" AS "MyColumn"
    FROM "MyTable";
    
    INSERT INTO "MyTable" ("MyColumn") values (2);
    
    SELECT * FROM "MyView";
    
      MyColumn
    ----------
      2.0E+000
    

    そしてdesc"MyView" まだ与える:

     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     MyColumn                                  NOT NULL BINARY_DOUBLE
    

    Leighが(dba.seでも)述べたように、ビューを挿入/更新したい場合は、の代わりにを使用できます。 VCまたは偽のバージョンでトリガーします。



    1. PostgreSQLストリーミングレプリケーション入門

    2. 文字列を連結/集約するための最適な方法

    3. SQLServerで文字列値とNULL値を連結する方法

    4. OracleのテーブルからN番目の行を選択します