【发布时间】:2012-12-10 01:17:36
【问题描述】:
我正在创建一个视图来向用户显示他/她的数据,但我也希望用户能够在这些视图中的某些字段中进行更改。视图中所做的更改是否也反映在基表中?
另外,我能否更新由多个基表组成的视图?
【问题讨论】:
标签: mysql sql-update views
我正在创建一个视图来向用户显示他/她的数据,但我也希望用户能够在这些视图中的某些字段中进行更改。视图中所做的更改是否也反映在基表中?
另外,我能否更新由多个基表组成的视图?
【问题讨论】:
标签: mysql sql-update views
如Updatable and Insertable Views 中所述:
有些视图是可更新的。也就是说,您可以在
UPDATE、DELETE或INSERT等语句中使用它们来更新基础表的内容。要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。还有某些其他构造使视图不可更新。更具体地说,如果视图包含以下任何内容,则它是不可更新的:
DISTINCT
GROUP BY
HAVING选择列表中的子查询
某些联接(请参阅本节后面的其他联接讨论)
FROM子句中的不可更新视图
WHERE子句中的子查询引用FROM子句中的表仅指文字值(在这种情况下,没有要更新的基础表)
使用
ALGORITHM = TEMPTABLE(使用临时表总是使视图不可更新)多次引用基表的任何列。
[ deletia ]假设可以使用
MERGE算法对其进行处理,有时可以更新多表视图。为此,视图必须使用内连接(不是外连接或UNION)。此外,只能更新视图定义中的单个表,因此SET子句必须仅命名视图中一个表中的列。不允许使用使用UNION ALL的视图,即使理论上它们可能是可更新的,因为实现使用临时表来处理它们。
【讨论】: