在檢視表的定義中可參考的最大表格數量為 61。
檢視表處理未最佳化
無法在檢視表上建立索引。
索引可用於使用合併演算法處理的檢視表。然而,使用臨時表演算法處理的檢視表無法利用其基礎表格上的索引(儘管在產生臨時表期間可以使用索引)。
有一個普遍的原則是,您無法在子查詢中修改表格並從同一個表格中選取。請參閱第 15.2.15.12 節,「子查詢的限制」。
如果您從選取該表格的檢視表中選取,如果檢視表在子查詢中選取該表格,且該檢視表使用合併演算法評估,則也適用相同的原則。範例
CREATE VIEW v1 AS
SELECT * FROM t2 WHERE EXISTS (SELECT 1 FROM t1 WHERE t1.a = t2.a);
UPDATE t1, v2 SET t1.a = 1 WHERE t1.b = v2.b;
如果檢視表使用臨時表評估,您可以從檢視表子查詢中的表格選取,並且仍然可以在外部查詢中修改該表格。在這種情況下,檢視表會儲存在臨時表中,因此您並不是真的在子查詢中選取表格並同時修改它。(這也是您可能希望強制 MySQL 使用臨時表演算法,方法是在檢視表定義中指定 ALGORITHM = TEMPTABLE
的另一個原因。)
您可以使用 DROP TABLE
或 ALTER TABLE
來捨棄或變更檢視表定義中使用的表格。DROP
或 ALTER
操作不會產生警告,即使這會使檢視表失效。相反地,當檢視表被使用時,會稍後發生錯誤。 CHECK TABLE
可用於檢查因 DROP
或 ALTER
操作而失效的檢視表。
關於檢視表的可更新性,檢視表的總體目標是,如果任何檢視表在理論上是可更新的,則在實務上應該也是可更新的。許多在理論上可更新的檢視表現在可以更新,但仍然存在限制。如需詳細資訊,請參閱第 27.5.3 節,「可更新和可插入的檢視表」。
目前檢視表的實作存在一個缺點。如果使用者被授予建立檢視表所需的基本權限(CREATE VIEW
和 SELECT
權限),除非該使用者也被授予 SHOW VIEW
權限,否則該使用者無法在該物件上呼叫 SHOW CREATE VIEW
。
此缺點可能會導致使用 mysqldump 備份資料庫時發生問題,這可能會因為權限不足而失敗。此問題在錯誤 #22062 中有所描述。
此問題的解決方法是讓管理員手動將 SHOW VIEW
權限授予被授予 CREATE VIEW
的使用者,因為 MySQL 在建立檢視表時不會隱式授予此權限。
檢視表沒有索引,因此索引提示不適用。從檢視表選取時,不允許使用索引提示。
SHOW CREATE VIEW
使用每個欄位的 AS
子句顯示檢視表定義。如果欄位是從運算式建立的,則預設別名是運算式文字,這可能會很長。alias_name
CREATE VIEW
陳述式中欄位名稱的別名會根據 64 個字元的欄位最大長度檢查(而不是 256 個字元的最大別名長度)。因此,如果任何欄位別名超過 64 個字元,則從 SHOW CREATE VIEW
的輸出建立的檢視表會失敗。對於具有過長別名的檢視表,這可能會在下列情況下導致問題
檢視表定義無法複寫到強制執行欄位長度限制的較新複本。
使用 mysqldump 建立的傾印檔案無法載入到強制執行欄位長度限制的伺服器中。
任一問題的解決方法是修改每個有問題的檢視表定義,以使用提供較短欄位名稱的別名。然後,檢視表會正確複寫,並且可以傾印和重新載入,而不會導致錯誤。若要修改定義,請使用 DROP VIEW
和 CREATE VIEW
捨棄並重新建立檢視表,或使用 CREATE OR REPLACE VIEW
取代定義。
對於在傾印檔案中重新載入檢視表定義時發生的問題,另一個解決方法是編輯傾印檔案以修改其 CREATE VIEW
陳述式。但是,這不會變更原始檢視表定義,這可能會導致後續傾印操作發生問題。