【问题标题】:Increasing inventory quantity based on SQL Server unique key violation根据 SQL Server 唯一键违规增加库存数量
【发布时间】:2017-05-14 06:40:55
【问题描述】:

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

我将使用Products 表中的PRDCTCODE 列作为Product Count 表中PRDCTCODE 列的外键。 Products 表中的 PRDCTCODE 列将有一个唯一的键约束,因此我的库存中的每个项目只能在我的 Products 表中出现一次,之后我打算做的是显示里面的实际数量我的Product Count 表。

我想知道的是:是否可以基于违反@987654334 中PRDCTCODE 列的唯一键约束来增加Product Count 表中PRDCTCOUNT 列中的产品数量@table 扫描相同的项目时?

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

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

如果只有 10 000 或 50 000 行,我想每次扫描一个项目时迭代不会有问题,但如果 Product Count 表中有 100 000 行并且有 1000 瓶牛奶正在扫描进来的?我可以想象,必须像扫描牛奶瓶一样快地遍历 100 000 行 1000 次,这可能会导致问题?

【问题讨论】:

  • 唯一约束控制新记录的添加。为什么要使用它来控制添加的产品数量?
  • 为了避免必须先在表中搜索才能找到项目。然后,违规将创建更新 PRDCTCOUNT 字段的机会,而该项目可能不存在于 Product Count 表中,并且不必先检查它是否存在。换句话说,如果存在违规,则意味着该项目存在于 Product Count 表中,那么剩下要做的就是更新查询。
  • 数据库是具有行和列的平面对象。表是数据库的视图,它只包含数据库的一部分,以便于读取和写入。所以物理上不可能让数据库中的同一个单元格同时有两个不同的值。

标签: c# sql sql-server-2012


【解决方案1】:

听起来您想要一个 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 2015-11-05
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多