首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 視圖完整指南:建立、查看、修改、更新與刪除操作詳解

     編輯:MySQL 資料庫相關知識

視圖是虛擬表,不儲存實體資料,僅保存 SELECT 定義。查詢視圖時即時從基表取數,基表變更自動反映。本文系統整理 MySQL 視圖的建立語法、算法選擇、權限檢查、查看方法、修改/更新限制與刪除操作。

視圖核心特性

  • 虛擬性:不佔用資料空間,僅儲存定義。
  • 即時性:基表資料變更,視圖即時反映。
  • 安全性:可限制用戶僅存取特定欄位/行,隱藏敏感欄位。
  • 邏輯獨立性:基表結構變更時,視圖可屏蔽影響(需同步修改視圖定義)。
  • 無參數:MySQL 視圖不支援輸入參數,互動性較弱。

建立視圖:CREATE VIEW

CREATE [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

算法選項

算法行為適用場景
UNDEFINEDMySQL 自動選擇(預設)通用
MERGE將視圖定義合併到查詢語句,直接查基表簡單視圖,效能最佳
TEMPTABLE先將視圖結果存入臨時表,再查臨時表含聚合/子查詢等不可合併場景

CHECK OPTION

  • CASCADED(預設):更新需滿足視圖及所有底層視圖/表條件,最嚴格。
  • LOCAL:僅檢查視圖本身定義條件。

建議:建立視圖時加上 WITH CASCADED CHECK OPTION,確保衍生視圖更新時遵守父視圖約束。

實戰案例:從 department、worker 建立 worker_view1

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;

查看視圖

方法命令輸出內容
DESCRIBEDESC view_name;欄位、型別、NULL、Key、Default、Extra
SHOW TABLE STATUSSHOW TABLE STATUS LIKE 'view_name';引擎、版本、行數、資料長度、建立時間、註解(VIEW)
SHOW CREATE VIEWSHOW CREATE VIEW view_name;完整建立語句、字元集、校對規則
information_schema.VIEWSSELECT * FROM information_schema.VIEWS;所有視圖詳細定義(含檢查選項、算法)

修改視圖

CREATE OR REPLACE VIEW(推薦)

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

ALTER VIEW worker_view1 AS
SELECT ...;  -- 完整新定義

更新視圖限制(重要)

以下情況不可更新視圖(無法透過視圖 INSERT/UPDATE/DELETE):

  1. 包含聚合函數:SUM(), COUNT(), MAX(), MIN()
  2. 包含 UNION, UNION ALL, DISTINCT, GROUP BY, HAVING
  3. 常量欄位(如 SELECT 'fixed' AS col)
  4. SELECT 中含子查詢
  5. 基於不可更新視圖建立的視圖
  6. 算法為 TEMPTABLE
  7. 基表有無預設值的 NOT NULL 欄位,且該欄位未包含在視圖中

最佳實務:視圖僅作為查詢簡化工具,不建議透過視圖修改資料,避免因限制導致業務邏輯錯誤。

刪除視圖

DROP VIEW [IF EXISTS] view_name1 [, view_name2 ...] [RESTRICT | CASCADE];
  • IF EXISTS:避免不存在報錯。
  • 多視圖以逗號分隔。
  • 僅刪除定義,基表資料不受影響。

權限需求對照

MySQL 視圖是簡化複雜查詢、實現行/欄級存取控制的利器。掌握 MERGE vs TEMPTABLE 算法差異、CHECK OPTION 級聯語義、更新限制清單,能設計出高效能、安全、可維護的視圖層。記住:視圖本質是「已命名的查詢」,善用它簡化 SQL,而非當作可寫入的實體表。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
操作所需權限儲存位置
CREATE VIEWCREATE VIEW + 基表 SELECTmysql.user
SHOW VIEWSHOW VIEWmysql.user
DROP VIEWDROPmysql.user