我正在开发库存控制系统,我在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次,就像有人可以扫描牛奶瓶一样快可能会导致问题?
答案 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;