更新MySQL中的视图

时间:2012-12-10 01:17:36

标签: mysql sql-update views

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

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

1 个答案:

答案 0 :(得分:6)

正如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的视图是不允许的,即使它们理论上可以更新,因为实现使用临时表来处理它们。