2017-03-20 1 views
0

に適用され、項目の3種類があります。SQLのチェック制約は、だから私は、私はアイテムを追跡し、このテーブルを持っているすべての行

  • は武器
  • アーマー
  • ポーション

  • CK_Weapon:

    私はそれらのための3つのチェック制約を作成しました

  • CK_Armour:CHECK ([Type]=(2) AND NOT ([PhysReduction]+[ElemReduction]<(1)))
  • CK_Potion:([Type]=(3) AND ([PhysDamage]+[ElemDamage])=(0) AND [AttackSpeed]=(0) AND ([PhysReduction]+[ElemReduction])=(0));

私は次のインサートとポーションを追加しよう。

DECLARE @num int, @Type int, @Name varchar(50), @Description varchar(50), @Gold int 

SET @Type = 3 
SET @Name = 'Spirit Potion' 
SET @Description = 'Restores a bit of Spirit' 
SET @Gold = 150 

insert into Item(Type, Name, Description, GoldValue) VALUES(@Type, @Name, @Description, @Gold) 

私は次のエラーを取得:

The INSERT statement conflicted with the CHECK constraint "CK_Weapon". The conflict occurred in database "Database", table "dbo.Item".

をしかし、ポーションタイプが3でなければなりませんので、それは、すべてでこのチェックをトリガーするべきではありません!
これらのCHECKを簡単に変更できるので、タイプが同じ場合にのみトリガーされます。

+0

insert文を追加して質問を編集します。 –

答えて

3

小切手の最初の部分を逆にして、気にしない行に「合格」を渡す必要があります。したがって、たとえばアーマーチェックのために、あなたはどちらかType2(ので、このチェック制約は気にしません)または(鎧には適用チェック)が渡されではないことを確認する必要があります

CHECK ([Type]!=(2) OR (NOT ([PhysReduction]+[ElemReduction]<(1)))) 

他のチェックのために繰り返します。チェック制約の組み合わせでは、1,2および3と同時に一致する必要があるため、現時点では行を挿入できません。

+0

ありがとうございました! – Blapple

+0

@Blapple、plz解決された場合、それを受け入れたものとしてマークしてください。 –

0

3つの制約を同じ列に入力しようとしていますが、入力している型に一致するものの1つのみがトリガーされることを願っています。

create table [RPGInventory] 
(
     [Type] tinyint not null 
    , [PhysDamage] int null 
    , [ElemDamage] int null 
    , [AttackSpeed] int null 
    , [PhysReduction] int null 
    , [ElemReduction] int null 
    , constraint ckInventoryType check (1 = iif([Type] = (1) 
               and not ([PhysDamage] + [ElemDamage]) < (1) 
               and [AttackSpeed] > (0.5), 1 
              , iif([Type] = (2) 
               and not ([PhysReduction] + [ElemReduction] < (1)), 1 
              , iif([Type] = (3) 
               and ([PhysDamage] + [ElemDamage]) = (0) 
               and [AttackSpeed] = (0) 
               and ([PhysReduction] + [ElemReduction]) = (0), 1, 0))) 
             ) 
) 
go 
:CK_Weapon制約に違反している理由、それはタイプに= 1

を期待しているようしかし、それはそれらをすべてチェックします、それはあなたがこのように、あなたの制約内側ケースロジックのビットを書き込むためにしようとする場合があります

関連する問題