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