視圖是虛擬表,不儲存實體資料,僅保存 SELECT 定義。查詢視圖時即時從基表取數,基表變更自動反映。本文系統整理 MySQL 視圖的建立語法、算法選擇、權限檢查、查看方法、修改/更新限制與刪除操作。
CREATE [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
| 算法 | 行為 | 適用場景 |
|---|---|---|
| UNDEFINED | MySQL 自動選擇(預設) | 通用 |
| MERGE | 將視圖定義合併到查詢語句,直接查基表 | 簡單視圖,效能最佳 |
| TEMPTABLE | 先將視圖結果存入臨時表,再查臨時表 | 含聚合/子查詢等不可合併場景 |
CASCADED(預設):更新需滿足視圖及所有底層視圖/表條件,最嚴格。LOCAL:僅檢查視圖本身定義條件。建議:建立視圖時加上 WITH CASCADED CHECK OPTION,確保衍生視圖更新時遵守父視圖約束。
CREATE VIEW worker_view1 AS
SELECT w.worker_id, w.name, d.dept_name
FROM worker w
JOIN department d ON w.dept_id = d.dept_id
WHERE w.status = 'active'
WITH CASCADED CHECK OPTION;
| 方法 | 命令 | 輸出內容 |
|---|---|---|
| DESCRIBE | DESC view_name; | 欄位、型別、NULL、Key、Default、Extra |
| SHOW TABLE STATUS | SHOW TABLE STATUS LIKE 'view_name'; | 引擎、版本、行數、資料長度、建立時間、註解(VIEW) |
| SHOW CREATE VIEW | SHOW CREATE VIEW view_name; | 完整建立語句、字元集、校對規則 |
| information_schema.VIEWS | SELECT * FROM information_schema.VIEWS; | 所有視圖詳細定義(含檢查選項、算法) |
CREATE OR REPLACE VIEW worker_view1 AS
SELECT w.worker_id, w.name, d.dept_name, w.email
FROM worker w
JOIN department d ON w.dept_id = d.dept_id
WHERE w.status = 'active'
WITH CASCADED CHECK OPTION;
存在則修改,不存在則建立,等同「刪除重建」但原子性更好。
ALTER VIEW worker_view1 AS
SELECT ...; -- 完整新定義
以下情況不可更新視圖(無法透過視圖 INSERT/UPDATE/DELETE):
SUM(), COUNT(), MAX(), MIN()UNION, UNION ALL, DISTINCT, GROUP BY, HAVINGSELECT 'fixed' AS col)SELECT 中含子查詢TEMPTABLENOT NULL 欄位,且該欄位未包含在視圖中最佳實務:視圖僅作為查詢簡化工具,不建議透過視圖修改資料,避免因限制導致業務邏輯錯誤。
DROP VIEW [IF EXISTS] view_name1 [, view_name2 ...] [RESTRICT | CASCADE];
IF EXISTS:避免不存在報錯。| 操作 | 所需權限 | 儲存位置 |
|---|---|---|
| CREATE VIEW | CREATE VIEW + 基表 SELECT | mysql.user |
| SHOW VIEW | SHOW VIEW | mysql.user |
| DROP VIEW | DROP | mysql.user |