在 MySQL 中更新视图

Posted

技术标签:

【中文标题】在 MySQL 中更新视图【英文标题】:Updating Views in MySQL 【发布时间】:2012-12-10 01:17:36 【问题描述】:

我正在创建一个视图来向用户显示他/她的数据,但我也希望用户能够在这些视图中的某些字段中进行更改。视图中所做的更改是否也反映在基表中?

另外,我能否更新由多个基表组成的视图?

【问题讨论】:

【参考方案1】:

如Updatable and Insertable Views 中所述:

有些视图是可更新的。也就是说,您可以在UPDATEDELETEINSERT 等语句中使用它们来更新基础表的内容。要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。还有某些其他构造使视图不可更新。更具体地说,如果视图包含以下任何内容,则它是不可更新的:

聚合函数(SUM()MIN()MAX()COUNT() 等)

DISTINCT

GROUP BY

HAVING

UNIONUNION ALL

选择列表中的子查询

某些联接(请参阅本节后面的其他联接讨论)

FROM 子句中的不可更新视图

WHERE 子句中的子查询引用FROM 子句中的表

仅指文字值(在这种情况下,没有要更新的基础表)

使用ALGORITHM = TEMPTABLE(使用临时表总是使视图不可更新)

多次引用基表的任何列。

[ deletia ]

假设可以使用MERGE 算法对其进行处理,有时可以更新多表视图。为此,视图必须使用内连接(不是外连接或UNION)。此外,只能更新视图定义中的单个表,因此SET 子句必须仅命名视图中一个表中的列。不允许使用使用 UNION ALL 的视图,即使理论上它们可能是可更新的,因为实现使用临时表来处理它们。

【讨论】:

我检查了 INFORMATION_SCHEMA.VIEWS 表,我的视图是可更新的。但是,当我尝试从非管理员用户 ID 更新它时,我收到错误“错误代码 1142: UPDATE command denied for user 'abc' for table 'view'”。尽管我已明确授予特定视图的更新权限。知道为什么我会收到此错误吗? @mishra 我猜,但也许用户还需要修改生成视图的基表的权限。你可能不想这样做。

以上是关于在 MySQL 中更新视图的主要内容,如果未能解决你的问题,请参考以下文章

mysql 视图

MySQL视图更新

MySQL--事务与视图

MySQL 经常重新创建视图的性能

MySql数据库之视图(定义视图查询视图更新视图视图的作用)

是否可以仅在数据发生更改时更新 mysql 视图?