如何使用同一 table 中其他两列的串联更新列

How to update a column with concatenate of two other column in a same table

我有一个包含 3 列 a、b 和 c 的 table。我想知道如何通过连接每行中的其他两列来更新第三列的值。

before update
 A    B    c 
-------------
1     4
2     5
3     6

after update
 A    B    c 
-------------
1     4    1_4
2     5    2_5
3     6    3_6

如何在 Oracle 中执行此操作?

使用连接运算符||:

update mytable set
c = a || '_' || b

或者更好的是,避免在插入或更新行时重新运行:

create view myview as
select *, a || '_' || b as c
from mytable

首先,您违反了规范化的规则。您必须重新考虑设计。如果您在 table 列中有值,那么要获得计算值,您只需要一个 select 语句以您想要的方式获取结果.存储计算值通常不是一个好主意,被认为是一个糟糕的设计。

无论如何,

既然你在 11g,如果你真的想要一个计算列,那么我建议使用 VIRTUAL COLUMN 而不是手动更新列。 UPDATE 语句涉及很多 overhead。使用虚拟列会减少很多开销。此外,您将完全摆脱手动工作和那些代码行来进行更新。 Oracle 为您代劳。

当然,您将在虚拟列子句中使用相同的连接条件。

有点像,

Column_c varchar2(50) GENERATED ALWAYS AS (column_a||'_'||column_b) VIRTUAL

注意:它的使用有一定的限制。因此,请在实施之前参考文档。但是,对于 OP 提供的简单用例,虚拟列是最合适的。

更新 我做了一个小测试。几乎没有观察到。请阅读此 以更好地了解如何实施我的建议。