1. 程式人生 > 其它 >MySQL修改檢視(ALTER VIEW)

MySQL修改檢視(ALTER VIEW)

修改檢視是指修改MySQL資料庫中存在的檢視,當基本表的某些欄位發生變化時,可以通過修改檢視來保持與基本表的一致性。

基本語法

可以使用 ALTER VIEW 語句來對已有的檢視進行修改。

語法格式如下:

ALTER VIEW <檢視名> AS <SELECT語句>

語法說明如下:

  • <檢視名>:指定檢視的名稱。該名稱在資料庫中必須是唯一的,不能與其他表或檢視同名
  • <SELECT 語句>:指定建立檢視的 SELECT 語句,可用於查詢多個基礎表或源檢視

需要注意的是,對於 ALTER VIEW 語句的使用,需要使用者具有針對檢視的 CREATE VIEW 和 DROP 許可權,以及由 SELECT 語句選擇的每一列上的某些許可權。

修改檢視的定義,除了可以通過 ALTER VIEW 外,也可以使用 DROP VIEW 語句先刪除檢視,再使用 CREATE VIEW 語句來實現

修改檢視內容

檢視是一個虛擬表,實際的資料來自於基本表,所以通過插入、修改和刪除操作更新檢視中的資料,實質上是在更新檢視所引用的基本表的資料

注意:對檢視的修改就是對基本表的修改,因此在修改時,要滿足基本表的資料定義。

某些檢視是可更新的。也就是說,可以使用 UPDATE、DELETE 或 INSERT 等語句更新基本表的內容。對於可更新的檢視,檢視中的行和基本表的行之間必須具有一對一的關係

還有一些特定的其他結構,這些結構會使得檢視不可更新。更具體地講,如果檢視包含以下結構中的任何一種,它就是不可更新的:

  • 聚合函式 SUM()、MIN()、MAX()、COUNT() 等。
  • DISTINCT 關鍵字。
  • GROUP BY 子句。
  • HAVING 子句。
  • UNION 或 UNION ALL 運算子。
  • 位於選擇列表中的子查詢。
  • FROM 子句中的不可更新檢視或包含多個表。
  • WHERE 子句中的子查詢,引用 FROM 子句中的表。
  • ALGORITHM 選項為 TEMPTABLE(使用臨時表總會使檢視成為不可更新的)的時候。

【例項 1】使用 ALTER 語句修改檢視 view_students_info,輸入的 SQL 語句和執行結果如下所示。

mysql> ALTER VIEW view_students_info
    -> AS SELECT id,name,age
    
-> FROM tb_students_info; Query OK, 0 rows affected (0.07 sec) mysql> DESC view_students_info; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | NO | | 0 | | | name | varchar(45) | YES | | NULL | | | age | int(11) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 3 rows in set (0.03 sec)

使用者可以通過檢視來插入、更新、刪除表中的資料,因為檢視是一個虛擬的表,沒有資料。通過檢視更新時轉到基本表上進行更新,如果對檢視增加或刪除記錄,實際上是對基本表增加或刪除記錄。

檢視檢視 view_students_info 的資料內容,如下所示。

mysql> SELECT * FROM view_students_info;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | Dany   |   24 |
|  2 | Green  |   23 |
|  3 | Henry  |   23 |
|  4 | Jane   |   22 |
|  5 | Jim    |   24 |
|  6 | John   |   21 |
|  7 | Lily   |   22 |
|  8 | Susan  |   23 |
|  9 | Thomas |   22 |
| 10 | Tom    |   23 |
+----+--------+------+
10 rows in set (0.00 sec)

【例項 2】使用 UPDATE 語句更新檢視 view_students_info,輸入的 SQL 語句和執行結果如下所示。

mysql> UPDATE view_students_info
    -> SET age=25 WHERE id=1;
Query OK, 0 rows affected (0.24 sec)
Rows matched: 1  Changed: 0  Warnings: 0
mysql> SELECT * FROM view_students_info;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | Dany   |   25 |
|  2 | Green  |   23 |
|  3 | Henry  |   23 |
|  4 | Jane   |   22 |
|  5 | Jim    |   24 |
|  6 | John   |   21 |
|  7 | Lily   |   22 |
|  8 | Susan  |   23 |
|  9 | Thomas |   22 |
| 10 | Tom    |   23 |
+----+--------+------+
10 rows in set (0.00 sec)
View Code

檢視基本表 tb_students_info 和檢視 v_students_info 的內容,如下所示

mysql> SELECT * FROM tb_students_info;
+----+--------+---------+------+------+--------+------------+
| id | name   | dept_id | age  | sex  | height | login_date |
+----+--------+---------+------+------+--------+------------+
|  1 | Dany   |       1 |   25 | F    |    160 | 2015-09-10 |
|  2 | Green  |       3 |   23 | F    |    158 | 2016-10-22 |
|  3 | Henry  |       2 |   23 | M    |    185 | 2015-05-31 |
|  4 | Jane   |       1 |   22 | F    |    162 | 2016-12-20 |
|  5 | Jim    |       1 |   24 | M    |    175 | 2016-01-15 |
|  6 | John   |       2 |   21 | M    |    172 | 2015-11-11 |
|  7 | Lily   |       6 |   22 | F    |    165 | 2016-02-26 |
|  8 | Susan  |       4 |   23 | F    |    170 | 2015-10-01 |
|  9 | Thomas |       3 |   22 | M    |    178 | 2016-06-07 |
| 10 | Tom    |       4 |   23 | M    |    165 | 2016-08-05 |
+----+--------+---------+------+------+--------+------------+
10 rows in set (0.00 sec)

mysql> SELECT * FROM v_students_info;
+------+--------+------+-------+-------+----------+------------+
| s_id | s_name | d_id | s_age | s_sex | s_height | s_date     |
+------+--------+------+-------+-------+----------+------------+
|    1 | Dany   |    1 |    25 | F     |      160 | 2015-09-10 |
|    2 | Green  |    3 |    23 | F     |      158 | 2016-10-22 |
|    3 | Henry  |    2 |    23 | M     |      185 | 2015-05-31 |
|    4 | Jane   |    1 |    22 | F     |      162 | 2016-12-20 |
|    5 | Jim    |    1 |    24 | M     |      175 | 2016-01-15 |
|    6 | John   |    2 |    21 | M     |      172 | 2015-11-11 |
|    7 | Lily   |    6 |    22 | F     |      165 | 2016-02-26 |
|    8 | Susan  |    4 |    23 | F     |      170 | 2015-10-01 |
|    9 | Thomas |    3 |    22 | M     |      178 | 2016-06-07 |
|   10 | Tom    |    4 |    23 | M     |      165 | 2016-08-05 |
+------+--------+------+-------+-------+----------+------------+
10 rows in set (0.00 sec)
View Code

修改檢視名稱

修改檢視的名稱可以先將檢視刪除,然後按照相同的定義語句進行檢視的建立,並命名為新的檢視名稱。