Database SQL如何在一个命令中为int列增加或减少一个

Database SQL如何在一个命令中为int列增加或减少一个,database,Database,我有一个订单表,它有一个数量列。在签入或签出期间,我们需要逐个更新该数量列。是否有一种方法可以在一个动作中实现这一点,或者我们必须得到现有的值,然后在其上加上或减去一 另一个问题是,当我们插入新行时,是否需要检查是否存在相同的数据,如果不存在,则插入,这是两个步骤,还是有更好的方法 谢谢,回答第一个问题: UPDATE Orders SET Quantity = Quantity + 1 WHERE ... 回答第二个问题: UPDATE Orders SET Quantity = Quant

我有一个订单表,它有一个数量列。在签入或签出期间,我们需要逐个更新该数量列。是否有一种方法可以在一个动作中实现这一点,或者我们必须得到现有的值,然后在其上加上或减去一

另一个问题是,当我们插入新行时,是否需要检查是否存在相同的数据,如果不存在,则插入,这是两个步骤,还是有更好的方法


谢谢,

回答第一个问题:

UPDATE Orders SET Quantity = Quantity + 1 WHERE ...
回答第二个问题:

UPDATE Orders SET Quantity = Quantity + 1 WHERE ...

有几种方法可以做到这一点。因为您没有指定数据库,所以我将假定为MySQL

  • 在重复键更新时插入表集x=1,y=2 x=x+1,y=y+2
  • 替换为表组x=1,y=2
  • 他们都能解决你的问题。但是,第一种语法允许更灵活地更新记录,而不是像第二种语法那样仅仅替换记录

    请记住,为了两者都存在,必须定义一个唯一的键

    UPDATE Orders Order
    SET Order.Quantity =  Order.Quantity - 1
    WHERE SomeCondition(Order)
    
    据我所知,SQL中没有内置对插入或更新的支持。我建议创建一个存储过程或使用条件查询来实现这一点。您可以找到不同数据库的解决方案集合。

    回答第二个问题:


    如果列设置为相同的值,则使列唯一并捕获异常。

    如果我的理解正确,更新应该非常简单。我只想做下面的事情

    UPDATE TABLE SET QUANTITY = QUANTITY + 1 and
    UPDATE TABLE SET QUANTITY = QUANTITY - 1 where QUANTITY > 0
    
    您可能需要额外的筛选器来更新单行而不是所有行

    对于插入,您可以在本地缓存与记录相关的一些唯一id,并根据此缓存进行检查,决定是否插入。另一种方法是始终插入并检查PK冲突错误,并忽略,因为这是一个冗余插入。

    @dotjoe 更新和检查@@rowcount更便宜,然后执行插入操作

    异常代价高昂&更新更频繁

    建议:如果您希望在DAL中表现出色,请在要更新的行的唯一ID中进行前端传递(如果为null insert)

    DAL应该是CRUD,不需要担心无状态

    如果使用良好的索引将其设置为无状态,则不会看到以下SQL vs 1语句的差异。 如果(选择顶部1*表格x,其中PK=@ID) 插入 其他的
    更新

    第一个问题的单步答案是使用以下内容:

    update TBL set CLM = CLM + 1 where key = 'KEY'
    
    这在很大程度上是一种单一的教学方法

    至于第二个问题,您不需要求助于DBMS特定的SQL技巧(如
    UPSERT
    )来获得您想要的结果。有一种标准的更新或插入方法不需要特定的DBMS

    try:
        insert into TBL (key,val) values ('xyz',0)
    catch:
        do nothing
    update TBL set val = val + 1 where key = 'xyz'
    
    也就是说,您尝试先进行创建。如果已经存在,则忽略错误。否则,将使用0值创建它

    然后执行将正常工作的更新,无论:

    • 这场争吵本来就存在
    • 有人在插入和更新之间更新了它

    这不是一条指令,但令人惊讶的是,这是我们很长一段时间以来成功实现这一点的方式。

    这样抛出保留字顺序可能会出现语法错误……因为您没有指定数据库,所以您应该真正采用标准SQL。