2012-12-10 44 views
3

我正在創建一個視圖來顯示用戶他/她的數據,但我也希望用戶能夠對這些視圖中的某些字段進行更改。視圖中所做的更改是否反映在基表中?在MySQL中更新視圖

此外,我是否能夠更新由多個基表組成的視圖?

回答

5

由於Updatable and Insertable Views下記載:

有些意見是可更新的。也就是說,您可以在諸如UPDATEDELETEINSERT之類的語句中使用它們來更新基礎表的內容。爲了使視圖可以更新,視圖中的行與基礎表中的行之間必須存在一對一的關係。還有一些其他構造使視圖不可更新。更具體地,視圖是不如果它包含以下任一可更新:

  • 集合函數(SUM()MIN()MAX()COUNT(),等等)

  • DISTINCT

  • GROUP BY

  • HAVING

  • UNIONUNION ALL

  • 子查詢在選擇列表

  • 某些連接(見附加在本節後面加入討論)的FROM子句中

  • 不可更新視圖

  • WHERE子句中的子查詢引用了中的表子句

  • 僅指文本值(在這種情況下,不存在基礎表更新)

  • 用途ALGORITHM = TEMPTABLE(使用臨時表的總是使一個視圖不可更新)

  • 多對基表的任何列的引用。

[ deletia ]

有時可以用於多表視圖可更新,假定它可與MERGE算法進行處理。爲此,視圖必須使用內連接(不是外連接或UNION)。此外,只能更新視圖定義中的單個表,因此SET子句必須僅命名視圖中其中一個表的列。使用UNION ALL的視圖即使可能在理論上可更新也是不允許的,因爲實現使用臨時表來處理它們。

+0

我檢查了INFORMATION_SCHEMA.VIEWS表,我的視圖是可更新的。但是,當我嘗試從非管理員用戶ID更新它,我得到錯誤「錯誤代碼1142:UPDATE命令拒絕用戶'abc'表'視圖'」。雖然我已經明確授予特定視圖的更新權限。任何想法爲什麼我會得到這個錯誤? – mishra

+0

@mishra我猜測,但也許用戶也需要權限來修改生成視圖的基表。你可能不想這樣做。 –