根据SQL Server唯一密钥违规

时间:2017-05-14 06:40:56

标签: c# sql sql-server-2012

我正在开发库存控制系统,我在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

我将使用PRDCTCODE表中的Products列作为PRDCTCODE表中Product Count列的外键。 PRDCTCODE表格中的Products列会在其上放置一个唯一的键约束,以便我的广告资源中的每个项目只能在我的Products表格中出现一次以及此后我打算做什么显示我Product Count表中的实际数量。

我想知道的是:是否可以根据违反唯一键约束的情况,在PRDCTCOUNT表格中的Product Count列中增加产品的数量在同一项目中扫描时PRDCTCODE表中的Products列?

例如:当将20瓶相同的牛奶扫描到库存中时,如果Products表中已经存在牛奶,我可以使用PRDCTCODE列中唯一键约束的违规错误增加PRDCTCOUNT表中的Product Count列?

这是个好主意吗?如果我故意导致/使用违规行为增加产品数量而不是遍历整个Product Count表格以首先找到匹配的产品,在PRDCTCOUNT列中读取数量然后增加/根据扫描或销售减少数量?

如果只有10 000或50 000行,我想每次扫描一个项目时都会重复进行迭代不会有问题,但如果Product Count表中有10万行和1000个瓶子怎么办?正在扫描牛奶?我可以想象,不得不迭代10万行1000次,就像有人可以扫描牛奶瓶一样快可能会导致问题?

1 个答案:

答案 0 :(得分: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;