一些视图是可更新的,对它们的引用可用于指定要在数据更改语句中更新的表。也就是说,您可以在 、 或 等语句中使用它们
UPDATE
来
DELETE
更新
INSERT
基础表的内容。
对于可更新的视图,视图中的行与基础表中的行之间必须存在一对一的关系。还有某些其他构造使视图不可更新。更具体地说,如果视图包含以下任何一项,则该视图不可更新:
假设多表视图可以用
MERGE
算法处理,有时它是可以更新的。为此,视图必须使用内部联接(而不是外部联接或
UNION
)。此外,只能更新视图定义中的单个表,因此该
SET
子句必须仅命名视图中其中一个表的列。使用的视图
UNION ALL
是不允许的,即使它们在理论上可能是可更新的。
关于可插入性(可通过
INSERT
语句更新),如果可更新视图也满足视图列的这些附加要求,则它是可插入的:
不得有重复的视图列名称。
视图必须包含基表中没有默认值的所有列。
视图列必须是简单的列引用。它们不能是表达式,例如:
3.14159 col1 + 3 UPPER(col2) col3 / col4 (subquery)
MySQL 会设置一个标志,称为视图可更新性标志
CREATE VIEW
。如果和
(以及类似操作)对于视图是合法的,则该标志设置为YES
(true)
。否则,标志设置为
(false)。表中的
列
显示此标志的状态。这意味着服务器始终知道视图是否可更新。
UPDATE
DELETE
NO
IS_UPDATABLE
INFORMATION_SCHEMA.VIEWS
如果视图不可更新,则 、 和 等语句
UPDATE
是
DELETE
非法
INSERT
的并被拒绝。(即使视图是可更新的,也可能无法插入其中,如本节其他地方所述。)
视图的可更新性可能会受到
updatable_views_with_limit
系统变量值的影响。请参阅第 5.1.7 节,“服务器系统变量”。
本节前面的讨论指出,如果不是所有列都是简单的列引用(例如,如果它包含表达式或复合表达式的列),则视图不可插入。尽管这样的视图不可插入,但如果您只更新不是表达式的列,则它可以更新。考虑这个观点:
CREATE VIEW v AS SELECT col1, 1 AS col2 FROM t;
此视图不可插入,因为col2
它是一个表达式。但如果更新不尝试更新它是可更新的col2
。此更新是允许的:
UPDATE v SET col1 = 0;
此更新是不允许的,因为它试图更新表达式列:
UPDATE v SET col2 = 0;
对于多表可更新视图,
INSERT
如果它插入到单个表中则可以工作。DELETE
不支持。
INSERT DELAYED
不支持视图。
如果表包含一AUTO_INCREMENT
列,插入到不包含该AUTO_INCREMENT
列的表的可插入视图中不会更改 的值
LAST_INSERT_ID()
,因为将默认值插入不属于视图的列的副作用不应该是可见的。