相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  儲存物件  /  檢視表的限制

27.9 檢視表的限制

在檢視表的定義中可參考的最大表格數量為 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 TABLEALTER TABLE 來捨棄或變更檢視表定義中使用的表格。DROPALTER 操作不會產生警告,即使這會使檢視表失效。相反地,當檢視表被使用時,會稍後發生錯誤。 CHECK TABLE 可用於檢查因 DROPALTER 操作而失效的檢視表。

關於檢視表的可更新性,檢視表的總體目標是,如果任何檢視表在理論上是可更新的,則在實務上應該也是可更新的。許多在理論上可更新的檢視表現在可以更新,但仍然存在限制。如需詳細資訊,請參閱第 27.5.3 節,「可更新和可插入的檢視表」

目前檢視表的實作存在一個缺點。如果使用者被授予建立檢視表所需的基本權限(CREATE VIEWSELECT 權限),除非該使用者也被授予 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 VIEWCREATE VIEW 捨棄並重新建立檢視表,或使用 CREATE OR REPLACE VIEW 取代定義。

對於在傾印檔案中重新載入檢視表定義時發生的問題,另一個解決方法是編輯傾印檔案以修改其 CREATE VIEW 陳述式。但是,這不會變更原始檢視表定義,這可能會導致後續傾印操作發生問題。