更新视图

可以对可修改视图使用 UPDATE 语句。然而,数据库服务器不支持更新任何派生列。派生列是由 CREATE VIEW 语句的选择列表中的表达式(例如 order_date + 30)生成的列。

以下示例显示了一个可修改视图,它包含一个派生列和对于该派生列可接受的 UPDATE 语句:
CREATE    VIEW   response(user_id, received, resolved, duration) AS
      SELECT user_id, call_dtime, res_dtime, res_dtime - call_dtime
            FROM cust_calls
            WHERE user_id = USER;

UPDATE response SET resolved = TODAY
      WHERE resolved IS NULL;

由于视图的 duration 列表示一个表达式,所以不能更新该列(数据库服务器无法决定如何在表达式命名的两个列之间分布更新值,即使在理论上也无法这样做)。但如果没有在 SET 子句中指定派生列,那么可以将视图视为表来执行更新。

即使基础表的行是唯一的,视图也可能会返回重复的行。无法对各重复行加以区分。如果更新一组重复行中的其中一行(例如:如果使用游标来更新 WHERE CURRENT),那么无法确定基础表中的哪一行接收到更新。