如果您在视图上有 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 值中的一个,则您无法知道更新哪个项价格。
重要: 如果您正在使用带有检查点的视图,则您不可更新远程表中的行。
以 UPDATE 语句直接修改视图中的数据值的替代方法,是在该视图上创建 INSTEAD OF 触发器。要获取更多信息,请参阅 视图上的 INSTEAD OF 触发器。
如果您正在在没有事务的数据库中更新行,则您必须采取显式的活动来恢复更新了的行。例如,如果在更新某些行之后 UPDATE 语句失败,则成功地更新了的行保留在表中。您不可自动地从失败的更新中恢复。
如果您正在带有事务的数据库中更新行,且您正在使用事务,则您将可使用 ROLLBACK WORK 语句撤销更新。如果在更新之前您未执行 BEGIN WORK 语句,且更新失败,则数据库服务器自动地回滚自从更新操作开始以来对该表进行的任何数据库修改。
CREATE TEMP TABLE 语句可包括 WITH NO LOG 选项来创建不支持事务日志记录的临时表。这些表不进行日志记录且不可恢复。
请不要在事务内使用 RAW 表。您以 CREATE RAW TABLE 语句创建的表不进行日志记录。因此,RAW 表是不可恢复的,即使数据库使用日志恢复。RAW 表通常用作初始加载和验证数据。在您已加载了数据之后,请使用 ALTER TABLE 语句来将该表更改为类型 STANDARD,并在您在事务中使用该表之前执行 0 级备份。要获取更多关于 RAW 表的信息,请参考 GBase 8s 管理员指南。
在符合 ANSI 的数据库中,事务是隐式的,且所有数据库修改都发生在事务内。在此情况下,如果 UPDATE 语句失败,您可使用 ROLLBACK WORK 来撤销更新。
如果您在显式的事务内,且更新失败,则数据库服务器自动地撤销该更新的影响。
当带着更新的意图选择行时,该更新进程需要 update 锁。update 锁允许其他进程读或共享将要被更新的行,但它们不允许那些进程更新或删除它。
就在更新发生之前,更新进程将共享锁提升为排他锁。排他锁防止其他进程读取或修改行的内容,直到释放该锁为止。
更新进程可从另一进程在行上或在有共享锁的页上获得 update 锁,但您不可将 update 锁从共享的提升到排他的(且不可发生更新),直到其他进程释放它的锁为止。
如果单个更新影响的行的数目很大,则您可超过在同时发生的锁的最大数目上设置的限制。如果发生此情况,则您可减少每 UPDATE 语句的事务数,或您可在执行该语句之前锁定页或整个表。