使用SET命令更新表中的多个列

时间:2017-03-29 17:22:35

标签: sql postgresql

我不一定有错误,主要是对于UPDATE幕后发生的事情感到好奇我正在尝试在单个记录上的同一个表的多个列上执行,使用该值一列和一些数学设置在另一列中设置值。基本上一对一是我想要完成的。 我在名为pipe_tally3的表中有这一行:

 id |  jt_id   | man_jt_num |  heat  | lt |   manu   | wall_thick | diam | grade | coat_type | coat_thick | loc  | cuts | new_lt | pup | notes |    date    
----+----------+------------+--------+----+----------+------------+------+-------+-----------+------------+------+------+--------+-----+-------+------------
  2 | Asset-33 | 1919A      | 39393b | 74 | american |      0.393 |   10 | x44   | stiff     | 12 mils    | yard |    0 |      0 | na  | na    | 2017-03-27

我尝试UPDATE就像这样:

UPDATE pipe_tally3
SET cuts = 2.0, new_lt = lt - cuts
WHERE jt_id = 'Asset-33';
UPDATE 1

然后当我再次检查那行时:

 id |  jt_id   | man_jt_num |  heat  | lt |   manu   | wall_thick | diam | grade | coat_type | coat_thick | loc  | cuts | new_lt | pup | notes |    date    
----+----------+------------+--------+----+----------+------------+------+-------+-----------+------------+------+------+--------+-----+-------+------------
  2 | Asset-33 | 1919A      | 39393b | 74 | american |      0.393 |   10 | x44   | stiff     | 12 mils    | yard |    2 |     74 | na  | na    | 2017-03-27

剪切列确实已更新,现在显示值2,但new_lt列显示值74.但它应该(或我希望它设置为)值72,这将是lt的值从第2列的剪切列中减去第74列。为什么这不起作用,这是我的主要问题? 但是如果我用

更新cut cut列
UPDATE pipe_tally3
SET cuts = 3.0 WHERE jt_id = 'Asset-33';
UPDATE 1

它确实得到了更新。

id |  jt_id   | man_jt_num |  heat  | lt |   manu   | wall_thick | diam | grade | coat_type | coat_thick | loc  | cuts | new_lt | pup | notes |    date    
----+----------+------------+--------+----+----------+------------+------+-------+-----------+------------+------+------+--------+-----+-------+------------
  2 | Asset-33 | 1919A      | 39393b | 74 | american |      0.393 |   10 | x44   | stiff     | 12 mils    | yard |    3 |     72 | na  | na    | 2017-03-27

然后我可以使用

UPDATE pipe_tally3
SET new_lt = lt - cuts WHERE jt_id = 'Asset-33';
UPDATE 1

在设置new_lt时,通过使用lt和cuts列中的值,它可以正常工作:

id |  jt_id   | man_jt_num |  heat  | lt |   manu   | wall_thick | diam | grade | coat_type | coat_thick | loc  | cuts | new_lt | pup | notes |    date    
----+----------+------------+--------+----+----------+------------+------+-------+-----------+------------+------+------+--------+-----+-------+------------
  2 | Asset-33 | 1919A      | 39393b | 74 | american |      0.393 |   10 | x44   | stiff     | 12 mils    | yard |    3 |     71 | na  | na    | 2017-03-27

我有没有办法在PostgreSQL中实现这一目标?提前谢谢。

编辑 我意识到我总是可以通过对值进行硬编码来实现这一点:

UPDATE pipe_tally3
SET cuts = 3.5, new_lt = lt - 3.5 
WHERE jt_id = 'Asset-33';
UPDATE 1

这有效

id |  jt_id   | man_jt_num |  heat  | lt |   manu   | wall_thick | diam | grade | coat_type | coat_thick | loc  | cuts | new_lt | pup | notes |    date    
----+----------+------------+--------+----+----------+------------+------+-------+-----------+------------+------+------+--------+-----+-------+------------
  2 | Asset-33 | 1919A      | 39393b | 74 | american |      0.393 |   10 | x44   | stiff     | 12 mils    | yard |  3.5 |   70.5 | na  | na    | 2017-03-27

只是想知道为什么它不起作用(或者我没有正确地做某事),如上所述。

2 个答案:

答案 0 :(得分:2)

如您所见= lt - cuts使用cuts 之前的值已更新74 - 0,因此值仍为74

这是大多数数据库中的行为,描述set the documentation的表达式值确认了这一点:

  

要分配给列的表达式。表达式可以使用表中此列和其他列的旧值

答案 1 :(得分:0)

update pipe_tally3
set cuts = s.cuts, new_lt = lt - s.cuts
from (
    select 2.0 as cuts
) s
where jt_id = 'asset-33';