更新子句

可选的 FOR UPDATE 子句用于标识在后续定位的 UPDATE 语句的赋值子句中可以作为目标出现的列。

更新子句

阅读语法图跳过可视化语法图FOR UPDATE OF,列名

每个列名必须是非限定性的,且必须标识在fullselect的第一个 FROM 子句中指定的表或视图的列。 如果fullselect的结果表是只读的,则不能指定该子句。

更改开始如果 FOR UPDATE 子句中指定了列名列表 ,且扩展指示器未启用, 则列名必须为可更新列。更改结束

子句中,如果没有指定列名列表,则隐式列名列表由表或视图中的所有可更新列组成,该表或视图在第一个 FOR UPDATE 子句中未指定列名列表 ,则隐式列名列表由全选查询的第一个 FROM 子句中标识的表或视图的所有可更新列。

如果动态准备的select语句不包含FOR UPDATE子句,则与select语句关联的游标不能在定位UPDATE语句中引用。

更改开始如果静态准备的SELECT语句不包含FOR UPDATE子句,且其结果表不是只读的,则会产生一个隐式UPDATE子句。 隐式列名列表确定如下:
  • 如果启用扩展指示符,则包括在fullselect的第一个FROM子句中标识的表或视图的所有列。
  • 否则,将包括在完整选择的第一FROM子句中标识的表或视图的所有可更新列。
更改结束

如果在准备程序时指定了STDSQL(YES)或NOFOR SQL处理选项,则定位UPDATE语句中引用的游标的声明无需包含 UPDATE 子句,前提是在准备程序时指定了STDSQL(YES)或NOFOR SQL处理选项。 更多信息,请参阅列的已定位更新

FOR UPDATE 使用FETCH操作时,当光标指向U或X锁时,而不是S锁时,会获取光标:

  • 该语句的隔离级别为游标稳定性。
  • 语句的隔离级别为可重复读取或读取稳定性,且RRULOCK子系统参数设置为YES。
  • 语句的隔离级别是可重复读取或读取稳定性,并且SQL语句中指定了“使用并保留排他性锁”或“使用并保留更新锁”,在获取时分别获取X锁或U锁。

已声明的临时表不会添加锁定。 有关U型锁和S型锁的讨论,请参阅锁具模式和锁具兼容性

注意

更改开始参考更新后的列:更改结束
更改开始如果游标使用FETCH语句来检索稍后要更新的列,则在选择列时指定FOR UPDATE OF。 然后在后续的UPDATE或DELETE语句中指定WHERE CURRENT OF。 这些条款阻止了 Db2 通过正在更新的列的索引进行选择访问,否则可能会导致 Db2 多次读取同一行。

更多信息,请参阅更新之前检索的数据

更改结束