通过视图更新行

如果您在视图上有 Update 权限,则您可通过单表视图更新数据(请参阅 GRANT 语句)。对于可更新的视图,定义该视图的查询必须不包含任何下列项:

此外,如果在有列的派生值的表上构建视图,则不可通过该视图更新那列。然而,可更新该视图中的其他列。在可更新的视图中,您可通过将值插入到该视图内来更新基础表中的值。

CREATE VIEW cust_view AS SELECT * FROM customer;
      UPDATE cust_view SET customer_num=10001 WHERE customer_cum=101;
    
下列语句定义包括 customer 表中所有行的视图,并将列值为 101 的任何行中的 customer_num 值更改为 10001
CREATE VIEW cust_view AS SELECT * FROM customer;
        UPDATE cust_view SET customer_num=10001 WHERE customer_num=101;
      

当更新值不适合定义了该视图的 SELECT 语句时,您可使用数据完整性约束来防止用户更新基础表中的值。要获取更多信息,请参阅 WITH CHECK OPTION 关键字

由于即使视图的基本表有唯一的行,在视图仍可发生重复的行,因此当通过视图更新表时请小心。例如,如果在 items 表上定义视图,且仅包含 order_num total_price 列,且如果来自同一订单的两项有相同的总价,则该视图包含重复的行。在此情况下,如果您更新两个重复的 total_price 值中的一个,则您无法知道更新哪个项价格。
Important: 如果您正在使用带有检查点的视图,则您不可更新远程表中的行。

以 UPDATE 语句直接修改视图中的数据值的替代方法,是在该视图上创建 INSTEAD OF 触发器。要获取更多信息,请参阅 视图上的 INSTEAD OF 触发器