首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 視圖操作完整指南:創建、使用、修改、刪除與權限陷阱

     編輯:MySQL 綜合教學

MySQL 視圖操作完整指南:創建、使用、修改、刪除與權限陷阱

視圖是虛擬表,不儲存實際數據,僅保存查詢定義。本文系統整理 MySQL 視圖的完整語法、增刪改查限制、字段別名技巧、依賴表結構變更風險及權限模型。

一、創建視圖

基礎語法


CREATE VIEW view_name AS SELECT_stmt;
-- 例:提取水果重量 ≤ 12 的記錄
CREATE VIEW v_fruit AS SELECT name, place, weight FROM t_fruit WHERE weight <= 12;

字段別名三種寫法

  1. SELECT 列別名:CREATE VIEW v_fruit AS SELECT name AS myname, place AS myplace, weight FROM t_fruit ...
  2. 視圖定義列表:CREATE VIEW v_fruit (myname, myplace, weight) AS SELECT name, place, weight FROM t_fruit ...(列數必須一致)
  3. 混合使用:視圖列表 + SELECT 別名雙重保險。

多表聯接與巢狀視圖

  • 支援多表 JOIN、子查詢(WHERE 子句中)、其他視圖作為來源;
  • 禁止:FROM 子句直接使用子查詢(CREATE VIEW v AS SELECT ... FROM (SELECT * FROM t) ... 報錯)。

WITH CHECK OPTION 约束


CREATE VIEW v_fruit AS SELECT ... WHERE weight <= 12 WITH CHECK OPTION;

插入/更新視圖時強制滿足 WHERE 條件,防止「視圖可見數據」外的資料寫入底表。

二、使用視圖:查詢無限制,增刪改有條件

  • SELECT:完全透明,等同查詢底表;
  • INSERT/UPDATE/DELETE:受限極多,常見失敗場景:
    • 視圖涉及多表聯接;
    • 視圖列包含聚合函數(SUM、COUNT 等)、表達式、常數;
    • 底表含 NOT NULL 無預設值列且視圖未包含該列;
    • 視圖定義含 DISTINCT、GROUP BY、UNION、子查詢等。

核心原則:視圖主要用於簡化查詢、權限隔離、業務封裝,非用於數據修改入口。

三、修改視圖


-- 方式 1:ALTER VIEW
ALTER VIEW v_fruit AS SELECT place AS myplace, weight FROM t_fruit WHERE weight <= 12;

-- 方式 2:CREATE OR REPLACE VIEW(不存在則創建,存在則替換)
CREATE OR REPLACE VIEW v_fruit AS SELECT place AS myplace, weight FROM t_fruit WHERE weight <= 12;

四、刪除視圖


DROP VIEW [IF EXISTS] view_name [, view_name2 ...];
  • IF EXISTS 避免不存在報錯;
  • 批量刪除:DROP VIEW v1, v2, v3; 部分不存在時其餘仍刪除,配合 IF EXISTS 靜默處理。

五、查看視圖結構


DESCRIBE view_name;  -- 或 DESC view_name;
SHOW CREATE VIEW view_name;  -- 顯示完整建視圖 DDL

六、底表結構變更的連鎖風險

視圖定義在創建時將 * 展開為具體列名,**不會自動同步**底表結構變更:

  • 底表列重命名/刪除 → 視圖查詢報錯 Unknown column;
  • 底表新增列 → 視圖不受影響(除非使用 * 重建)。

運維建議:

  1. 避免視圖使用 SELECT *,顯式列出列名;
  2. DDL 變更流程中納入「檢查依賴視圖」步驟(SELECT * FROM information_schema.VIEWS WHERE VIEW_DEFINITION LIKE '%table_name%');
  3. 重要視圖建立單元測試保護。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved