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

SQL Server 2005 の DEFAULT 定義で別の列を参照する

    ほら、実際のテーブル/列名を提供していないので、スキーマの例でこれを示しています。

    表:

    CREATE TABLE test
      (
         id   INT NOT NULL PRIMARY KEY IDENTITY, --made up key
         col1 INT, --first column to add, wasn't sure if this was nullable or not
         col2 INT, --second column to add, wasn't sure if this was nullable or not
         col3 INT NOT NULL --this is the column to optionally insert into
      ) 
    

    トリガーの定義は次のとおりです:

    CREATE TRIGGER demo
    ON test
    INSTEAD OF INSERT
    AS
        INSERT INTO test (col1,col2,col3)
        SELECT inserted.col1,
               inserted.col2,
               CASE
                 WHEN inserted.col3 IS NULL THEN COALESCE(inserted.col1, 0) + COALESCE(inserted.col2, 0)
                 ELSE inserted.col3
               END
        FROM   inserted
    

    基本的に、テーブルで実行された挿入ステートメントをトリガー内のステートメントに置き換えるため、 inserted を使用してチェックします null 非許容のオプションの列 col3 に挿入しようとしている値を確認するための一時テーブル 、 無効です。ある場合は、col1 を追加して置き換えます および col2 (2 つのソース列が null 可能かどうかについて言及していないため、ゼロと合体しています)。

    col3 という事実にもかかわらず、それを含むかどうかに関係なく、insert ステートメントを実行できます。 null 可能ではありません:

    INSERT INTO test(col1,col2)
    SELECT 12, 31
    GO
    
    INSERT INTO test(col1, col2, col3)
    SELECT 1, 2, 89
    GO
    

    結果:

    ID  COL1 COL2 COL3
    ------------------  
    1   12   31    43
    2   1    2     89
    

    トリガーが存在しない場合、最初の挿入ステートメントを実行しようとしたときにエラーが発生し、col3 に NULL を挿入できないことが通知された可能性があります。 .

    また、値を指定する 2 番目の挿入ステートメントが、要求どおりに追加で置き換えられていないことにも注意してください。

    動作中の SQL Fiddle を次に示します。 .




    1. 警告:mysql_fetch_object():指定された引数は有効なMySQL結果リソースではありません

    2. 便利なPHPデータベースクラス

    3. MariaDBでデータベースの文字セットと照合を設定する

    4. クエリを実行するとSQL構文エラーが発生する