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

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

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

【问题讨论】:

    标签: mysql sql-update views


    【解决方案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 我猜,但也许用户还需要修改生成视图的基表的权限。你可能不想这样做。
    猜你喜欢
    • 1970-01-01
    • 2013-10-14
    • 2011-12-26
    • 1970-01-01
    • 2013-02-28
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    相关资源
    最近更新 更多