在 MySQL 中更新视图
Posted
技术标签:
【中文标题】在 MySQL 中更新视图【英文标题】:Updating Views in MySQL 【发布时间】:2012-12-10 01:17:36 【问题描述】:我正在创建一个视图来向用户显示他/她的数据,但我也希望用户能够在这些视图中的某些字段中进行更改。视图中所做的更改是否也反映在基表中?
另外,我能否更新由多个基表组成的视图?
【问题讨论】:
【参考方案1】:如Updatable and Insertable Views 中所述:
有些视图是可更新的。也就是说,您可以在
UPDATE
、DELETE
或INSERT
等语句中使用它们来更新基础表的内容。要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。还有某些其他构造使视图不可更新。更具体地说,如果视图包含以下任何内容,则它是不可更新的:聚合函数(
SUM()
、MIN()
、MAX()
、COUNT()
等)
DISTINCT
GROUP BY
HAVING
UNION
或UNION 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 中更新视图的主要内容,如果未能解决你的问题,请参考以下文章