2017-05-14 5 views
1

在庫管理システムで作業しており、SQL Serverに2つのテーブルがあります。SQL Serverのユニークキー違反に基づいて在庫数を増やす

製品:

PRDCTID | PRDCTCODE |PRDCTNAME| DATEADDED 
    ---------|-----------|---------|--------- 
    1  |  200 |VW Milk | 2017/05/15 
    2  |  310 |AX Milk | 2011/05/15 
    3  |  255 |XY Bread | 2000/05/15 
    4  |  115 |ZZ BREAD | 1999/05/15 

製品数:

 PRDCTCODE |PRDCTCOUNT| DATEUPDATED 
    -----------|----------|--------- 
      200 |30  | 2017/05/15 
      310 |10  | 2011/05/15 
      255 |50  | 2000/05/15 
      115 |200  | 1999/05/15 

私はProduct Countテーブル内PRDCTCODE列に外部キーとしてProductsテーブルからPRDCTCODE列を使用することになります。 ProductsテーブルのPRDCTCODEカラムには固有のキー制約が設定されているため、在庫内の各アイテムはProductsテーブルに1回しか表示されません。そのあとで行うことは、実際の数量をProduct Countテーブルに表示することです。

私が知りたいのは、次のとおりです。それはProductsテーブル内のPRDCTCODE列に一意キー制約の違反に基づくProduct Count表にPRDCTCOUNT欄に製品の数量を増加させることが可能であるとき、同一の走査項目?例えば

:インベントリに同じ牛乳の20本をスキャンするときにミルクがすでにProductsテーブルに存在する場合、私は中PRDCTCOUNT列を高めるためにPRDCTCODE列に一意キー制約の違反エラーを使用することができますProduct Countテーブル?

それは良い考えですか?意図的に違反を引き起こし、製品番号をProduct Countテーブル全体を反復するのではなく、一致する製品を最初に検索し、PRDCTCOUNT列の数量を読み取り、スキャンに基づいて量を増減させる売る?

アイテムがスキャンされるたびに反復処理が行われるとは限りませんが、Product Countテーブルに100,000行があり、1000本のミルクがスキャンされている場合に?誰かがミルクのボトルをスキャンして問題を引き起こす可能性があるので、100000行を1000回繰り返す必要があると思いますか?

+0

ユニーク制約は、新規の追加を制御します_記録_。なぜこれを使用して、追加された製品の数を制御しますか? –

+0

最初に項目を検索するためにテーブルを検索する必要がないようにする。この違反は、PRDCTCOUNTフィールドを更新する機会を作り出し、アイテムがProduct Countテーブルに存在せず、最初に存在することを確認する必要もありません。言い換えれば、アイテムがProduct Countテーブルに存在することを意味する違反がある場合、残っている唯一のことは更新クエリです。 –

+0

データベースは、行と列を持つフラットオブジェクトです。表は、データベースの一部であり、読み取りと書き込みを容易にするためのデータベースのビューです。したがって、データベース内の同じセルに同時に2つの異なる値を持たせることは物理的に不可能です。 – jdweng

答えて

0

upsertのように聞こえますが、それ以外の方法で説明しています。私は適切にこれを行う方法の詳細な説明を提供しています。この記事を読むことをお勧めします:Sam Saffron''s upsert (update/insert) patterns

手順は、そのためにどのように見えるかのラフ版:

create procedure dbo.ProductCount_upsert (
    @prdctcode int 
) as 
begin 
    set nocount, xact_abort on; 
    begin tran 
    update dbo.ProductCount (with serializable) 
     set prdctcount = prdctcount +1 
     , dateupdated = getdate() 
     where prdctcode = @prdctcode; 
    if @@rowcount = 0 
    begin; 
     insert into dbo.ProductCount (prdctcode, prdctcount, dateupdated) 
     values (@prdctcode, 1, getdate()); 
    end; 
    commit tran 
end; 
関連する問題