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 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

立即開始
廣告