Sql 有没有办法将值从一个单元格转移到另一个单元格?

Sql 有没有办法将值从一个单元格转移到另一个单元格?,sql,mysql,database,Sql,Mysql,Database,SQL语言或MySQL(或其他DBMA)中是否有任何方法可以将值从一个单元格传输到另一个单元格?例如,假设有一个名为user_cars的表,其结构如下: |id| |user_name| |num_cars| 鲍勃有5辆车,约翰有3辆车。有没有办法在一个查询中从Bob中减去2辆车,再向John添加2辆车?我知道这可以通过两个更新查询来完成,但我只是想知道是否有更有效的方法。这就是事务的目的。如果您真的想在一个查询中完成,您可以在表的自连接上进行更新,但这两种方法都可读性较差,而且可能效率较低。

SQL语言或MySQL(或其他DBMA)中是否有任何方法可以将值从一个单元格传输到另一个单元格?例如,假设有一个名为user_cars的表,其结构如下:

|id| |user_name| |num_cars|

鲍勃有5辆车,约翰有3辆车。有没有办法在一个查询中从Bob中减去2辆车,再向John添加2辆车?我知道这可以通过两个更新查询来完成,但我只是想知道是否有更有效的方法。

这就是事务的目的。

如果您真的想在一个查询中完成,您可以在表的自连接上进行更新,但这两种方法都可读性较差,而且可能效率较低。

对于Oracle,您可以这样做。不知道mysql中是否有类似的版本。显然,这个特殊的陈述对于你所说的例子是非常具体的

 UPDATE user_cars
   SET num_cars = num_cars +
                     CASE WHEN user_name='Bob' THEN -2
                          WHEN user_name='John' THEN +2
                     END
   WHERE user_name IN ( 'Bob', 'John' )

这会起作用,但并不令人愉快:

UPDATE USER_CARS UC
SET
  NUM_CARS = NUM_CARS + CASE WHEN UC.USER_NAME = 'Bob'
                             THEN -2  --take from bob
                             WHEN UC.USER_NAME = 'John'
                             THEN 2  --give to John
                             ELSE 0  --no change for anybody else
                        END

我同意乔纳斯·克莱明的观点,没有一种有意义的方法可以做到这一点。这正是发明事务的目的。

正如其他人所解释的,您可以通过案例陈述来实现。
然而,这样做可能是不明智的,因为这会使代码的意图更难理解。这将使后续程序员更难理解代码的目的

除非您有某些特定的理由需要在一条语句中执行此操作,否则最好使用两条update语句,如果需要,将它们包装到事务中

我经常想起这句话(尽管我不得不在上面查找归因):

程序必须是为人们阅读而编写的,而且只是为机器执行而编写的
-Abelson&Sussman,SICP,第一版前言

您仍然应该使用WHERE子句来限制正在更新的行的数量(仅限于Bob和John)。添加零将导致相同的值,但它仍然会被视为事务日志、触发器等的更改。具有多行的表将导致性能降低。