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

5Yr*_*DBA 108 database

我有一个订单表,其中有一个数量列.在办理登机手续或退房时,我们需要将"数量"列更新一次.有没有办法在一个动作中执行此操作,或者我们必须获取现有值,然后在其上添加或减少一个值?

另一个问题是当我们插入一个新行时,我们是否需要检查是否存在相同的数据然后插入,如果没有,这是两个步骤,还是有更好的方法来执行此操作?

谢谢,

gah*_*ooa 233

回答第一个问题:

UPDATE Orders SET Quantity = Quantity + 1 WHERE ...
Run Code Online (Sandbox Code Playgroud)

回答第二个问题:

有几种方法可以做到这一点.由于您没有指定数据库,我将假设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

他们都可以处理你的问题.但是,第一种语法允许更灵活地更新记录而不是仅仅替换它(如第二种方法那样).

请记住,两者都存在,必须定义一个UNIQUE键...

  • 由于您没有指定数据库,因此您应该假设标准SQL. (30认同)

pax*_*blo 11

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

update TBL set CLM = CLM + 1 where key = 'KEY'
Run Code Online (Sandbox Code Playgroud)

这是一种单指令方式.

至于第二个问题,你不应该求助于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'
Run Code Online (Sandbox Code Playgroud)

也就是说,您首先尝试进行创建.如果它已经存在,请忽略该错误.否则,您使用0值创建它.

然后执行更新,无论是否正常工作:

  • 该行最初存在.
  • 有人在您的插入和更新之间更新了它.

这不是一个单一的指令,但令人惊讶的是,这是我们长期以来成功地做到这一点的方式.


Dan*_*ner 5

UPDATE Orders Order
SET Order.Quantity =  Order.Quantity - 1
WHERE SomeCondition(Order)
Run Code Online (Sandbox Code Playgroud)

据我所知,SQL 中没有对 INSERT-OR-UPDATE 的内置支持。我建议创建一个存储过程或使用条件查询来实现这一点。在这里,您可以找到针对不同数据库的一系列解决方案。