SQL如何增加或减less一个int列在一个命令
我有一个订单表有一个数量列。 在签入或签出时,我们需要将该数量列更新一次。 有没有办法做到这一点,或者我们必须得到现有的价值,然后加上或减去之一呢?
另一个问题是,当我们插入一个新的行时,我们是否需要检查是否存在相同的数据,如果不是,插入两个步骤,还是有更好的方法来做到这一点?
谢谢,
要回答第一个问题:
UPDATE Orders SET Quantity = Quantity + 1 WHERE ...
要回答第二个问题:
有几种方法可以做到这一点。 既然你没有指定数据库,我会假设MySQL。
-
INSERT INTO table SET x=1, y=2 ON DUPLICATE KEY UPDATE x=x+1, y=y+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