SQL如何增加或减less一个int列在一个命令

我有一个订单表有一个数量列。 在签入或签出时,我们需要将该数量列更新一次。 有没有办法做到这一点,或者我们必须得到现有的价值,然后加上或减去之一呢?

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

谢谢,

要回答第一个问题:

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

要回答第二个问题:

有几种方法可以做到这一点。 既然你没有指定数据库,我会假设MySQL。

  1. INSERT INTO table SET x=1, y=2 ON DUPLICATE KEY UPDATE x=x+1, y=y+2
  2. REPLACE INTO table SET x=1, y=2

他们都可以处理你的问题。 但是,第一种语法允许更加灵活地更新logging,而不是仅仅replace它(如第二种)。

请记住,为了两个存在,必须有一个唯一的密钥定义…

第一个问题的单步回答是使用类似于:

 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值创build它。

然后做更新,这将正确工作是否:

  • 该行原来是存在的。
  • 有人在插入和更新之间更新它。

这不是一个单一的指令,然而,令人惊讶的是,这是我们长期以来的成功。

如果我的理解是正确的,更新应该是非常简单的。 我只会做以下。

 UPDATE TABLE SET QUANTITY = QUANTITY + 1 and UPDATE TABLE SET QUANTITY = QUANTITY - 1 where QUANTITY > 0 

您可能需要额外的filter来更新一行而不是所有的行。

对于插入,您可以在本地caching一些与您的logging相关的唯一ID,并检查这个caching并决定是否插入。 替代方法是总是插入并检查PK违规错误,并忽略,因为这是一个冗余插入。

 UPDATE Orders Order SET Order.Quantity = Order.Quantity - 1 WHERE SomeCondition(Order) 

据我所知,在SQL中没有对INSERT-OR-UPDATE的内build支持。 我build议创build一个存储过程或使用条件查询来实现这一点。 在这里您可以find不同数据库的解决scheme集合。

回答第二个问题:

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

@dotjoe更新和检查@@ rowcount更便宜,事后做一个插入。

例外是昂贵的&&更新更频繁

build议:如果你想在你的DAL中成为超级性能的话,让前端传入一个唯一的ID来更新行,如果为null insert的话。

DAL应该是CRUD,不用担心无国籍。

如果你使它成为无状态,有了好的索引,你将不会看到下面的SQL vs 1语句的差异。 IF(select top 1 * form x where PK = @ ID)Insert else update