MySQL 檢視可能出現不一致的情況,我們如何確保其一致性?


在可更新檢視的情況下,我們很有可能更新了透過檢視不可見的資料,因為我們建立檢視是為了顯示錶的部分資料。這種更新會導致檢視不一致。我們可以透過在建立或修改檢視時使用 **WITH CHECK OPTION** 來確保檢視的一致性。雖然 WITH CHECK OPTION 子句是 CREATE VIEW 語句的可選部分,但它對於使檢視保持一致非常有用。

基本上,WITH CHECK OPTION 子句阻止我們更新或插入透過檢視不可見的行。簡單來說,我們可以說在使用 WITH CHECK OPTION 子句後,MySQL 會確保插入或更新操作符合檢視的定義。以下是 WITH CHECK OPTION 子句的語法:

語法

CREATE OR REPLACE VIEW view_name AS Select_statement WITH CHECK OPTION;

示例

為了說明上述概念,我們使用表 'Student_info' 中的以下資料:

mysql> Select * from student_info;
+------+---------+------------+------------+
| id   | Name    | Address    | Subject    |
+------+---------+------------+------------+
| 101  | YashPal | Amritsar   | History    |
| 105  | Gaurav  | Chandigarh | Literature |
| 125  | Raman   | Shimla     | Computers  |
| 130  | Ram     | Jhansi     | Computers  |
+------+---------+------------+------------+
4 rows in set (0.08 sec)

現在,藉助以下查詢,我們將建立名為 'Info' 的檢視。這裡我們沒有使用 WITH CHECK OPTION。

mysql> Create OR Replace VIEW Info AS Select Id, Name, Address, Subject from student_info WHERE Subject = 'Computers';
Query OK, 0 rows affected (0.46 sec)

mysql> Select * from info;
+------+-------+---------+-----------+
| Id   | Name  | Address | Subject   |
+------+-------+---------+-----------+
| 125  | Raman | Shimla  | Computers |
| 130  | Ram   | Jhansi  | Computers |
+------+-------+---------+-----------+
2 rows in set (0.00 sec)

由於我們沒有使用 WITH CHECK OPTION,因此我們可以在 'Info' 中插入/更新新行,即使它與定義不匹配。這在以下查詢及其結果中進行了說明:

mysql> INSERT INTO Info(Id, Name, Address, Subject) values(132, 'Shyam','Chandigarh', 'Economics');
Query OK, 1 row affected (0.37 sec)

mysql> Select * from student_info;
+------+---------+------------+------------+
| id   | Name    | Address    | Subject    |
+------+---------+------------+------------+
| 101  | YashPal | Amritsar   | History    |
| 105  | Gaurav  | Chandigarh | Literature |
| 125  | Raman   | Shimla     | Computers  |
| 130  | Ram     | Jhansi     | Computers  |
| 132  | Shyam   | Chandigarh | Economics  |
+------+---------+------------+------------+
5 rows in set (0.00 sec)

mysql> Select * from info;
+------+-------+---------+-----------+
| Id   | Name  | Address | Subject   |
+------+-------+---------+-----------+
| 125  | Raman | Shimla  | Computers |
| 130  | Ram   | Jhansi  | Computers |
+------+-------+---------+-----------+
2 rows in set (0.00 sec)

上述結果集表明新行與 'Info' 的定義不匹配,因此在檢視中不可見。現在,在以下查詢中,我們正在建立相同的檢視 'Info'

透過使用 'WITH CHECK OPTION':

mysql> Create OR Replace VIEW Info AS Select Id, Name, Address, Subject from student_info WHERE Subject = 'Computers' WITH CHECK OPTION;
Query OK, 0 rows affected (0.06 sec)

現在,如果我們嘗試插入與檢視 'Info' 定義匹配的行,MySQL 允許我們這樣做。這可以透過以下查詢及其結果來明確。

mysql> INSERT INTO Info(Id, Name, Address, Subject) values(133, 'Mohan','Delhi','Computers');
Query OK, 1 row affected (0.07 sec)

mysql> Select * from info;
+------+-------+---------+-----------+
| Id   | Name  | Address | Subject   |
+------+-------+---------+-----------+
| 125  | Raman | Shimla  | Computers |
| 130  | Ram   | Jhansi  | Computers |
| 133  | Mohan | Delhi   | Computers  |
+------+-------+---------+-----------+
3 rows in set (0.00 sec)

但是,假設如果我們嘗試插入與檢視 'Info' 定義不匹配的行,MySQL 將不允許我們這樣做並丟擲錯誤:

mysql> INSERT INTO Info(Id, Name, Address, Subject) values(134, 'Charanjeet','Amritsar','Geophysics');
ERROR 1369 (HY000): CHECK OPTION failed

更新於: 2020-06-22

130 次檢視

啟動你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.