使用 UPDATE 语句更改表中的数据

要更新表或视图中的数据,请使用 UPDATE 语句。

使用 UPDATE 语句,您可以更改每行中满足 WHERE 子句的搜索条件的一个或多个列的值。 UPDATE 语句的结果是表的零行或多行中的一个或多个已更改列值 (取决于满足 WHERE 子句中指定的搜索条件的行数)。 UPDATE 语句如下所示:

   UPDATE table-name
     SET column-1 = value-1,
         column-2 = value-2, ...
     WHERE search-condition ...

假设员工已重新定位。 更新 CORPDATA.EMPLOYEE 表以反映移动,运行以下语句:

   UPDATE CORPDATA.EMPLOYEE
     SET JOB = :PGM-CODE,
         PHONENO = :PGM-PHONE
     WHERE EMPNO = :PGM-SERIAL;

使用 SET 子句为要更新的每个列指定新值。 SET 子句对要更新的列进行命名,并提供要将这些列更改为的值。 您可以指定以下类型的值:

  • 列名。 将该列的当前值替换为同一行中另一列的内容。
  • 常量。 将列的当前值替换为 SET 子句中提供的值。
  • 空值。 使用关键字 NULL 将列的当前值替换为空值。 必须将该列定义为能够在创建表时包含空值,否则将发生错误。
  • 主变量。 将列的当前值替换为主变量的内容。
  • 全局变量。 将列的当前值替换为全局变量的内容。
  • 专用寄存器。 将列的当前值替换为专用寄存器值; 例如, USER。
  • 表达式。 将列的当前值替换为表达式产生的值。
  • 标量全查询。 将列的当前值替换为子查询返回的值。
  • DEFAULT 关键字。 将列的当前值替换为列的缺省值。 必须为该列定义缺省值,或者允许 NULL 值,否则将发生错误。

以下 UPDATE 语句使用许多不同的值:

   UPDATE WORKTABLE
      SET COL1 = 'ASC',
          COL2 = NULL,
          COL3 = :FIELD3,
          COL4 = CURRENT TIME,
          COL5 = AMT - 6.00,
          COL6 = COL7
       WHERE EMPNO = :PGM-SERIAL;

要标识要更新的行,请使用 WHERE 子句:

  • 要更新单行,请使用仅选择一行的 WHERE 子句。
  • 要更新多行,请使用仅选择要更新的行的 WHERE 子句。

可以省略 WHERE 子句。 如果执行此操作,那么 SQL 将使用您提供的值来更新表或视图中的每行。

如果数据库管理器在运行 UPDATE 语句时发现错误,那么它将停止更新并返回负 SQLCODE。 如果指定 COMMIT (*ALL) , COMMIT (*CS) , COMMIT (*CHG) 或 COMMIT (*RR) ,那么不会更改表中的任何行 (此语句已更改的行 (如果有) 将恢复为它们先前的值)。 如果指定了 COMMIT (*NONE) ,那么已更改的任何行 不会 恢复到先前的值。

如果数据库管理器找不到任何符合搜索条件的行,那么将返回 SQLCODE +100。

注: UPDATE 语句可能已更新多行。 更新的行数反映在 SQLCA 的 SQLERRD (3) 中。 此值也可从 GET DIAGNOSTICS 语句中的 ROW_COUNT 诊断项获取。

可通过多种方式使用 UPDATE 语句的 SET 子句来确定要在要更新的每一行中设置的实际值。 以下示例列出了每个列及其相应值:

UPDATE EMPLOYEE
  SET WORKDEPT = 'D11',
      PHONENO = '7213',
      JOB = 'DESIGNER'
  WHERE EMPNO = '000270';

您还可以通过指定所有列,然后指定所有值来编写此 UPDATE 语句:

UPDATE EMPLOYEE
  SET (WORKDEPT, PHONENO, JOB)
      = ('D11', '7213', 'DESIGNER')
  WHERE EMPNO = '000270';