在本教學中,我們將向您展示如何通過視圖創建可更新視圖並更新基礎表中的數據。
MySQL可更新視圖簡介
在MySQL中,視圖不僅是可查詢的,而且是可更新的。這意味著您可以使用INSERT或UPDATE語句通過可更新視圖插入或更新基表的行。 另外,您可以使用DELETE語句通過視圖刪除底層表的行。
但是,要創建可更新視圖,定義視圖的SELECT語句不能包含以下任何元素:
- 聚合函數,如:MIN,MAX,SUM,AVG,COUNT等。
- DISTINCT子句
- GROUP BY子句
- HAVING子句
- UNION或
UNION ALL
子句 - 左連接或外連接。
- SELECT子句中的子查詢或引用該表的WHERE子句中的子查詢出現在
FROM
子句中。 - 引用
FROM
子句中的不可更新視圖 - 僅引用文字值
- 對基表的任何列的多次引用
如果使用TEMPTABLE演算法創建視圖,則無法更新視圖。
請注意,有時可以使用內部連接創建基於多個表的可更新視圖。
MySQL可更新視圖示例
讓我們先來看看如何創建一個可更新的視圖。
首先,基於示例資料庫(zaixiandb)中的offices
表創建一個名為officeInfo
的視圖。該視圖指的是offices
表中的三列:officeCode
,phone
和 city
。
CREATE VIEW officeInfo
AS
SELECT officeCode, phone, city
FROM offices;
接下來,使用以下語句從officeInfo
視圖中查詢數據:
SELECT
*
FROM
officeInfo;
執行上面查詢語句,得到以下結果 -
mysql> SELECT * FROM officeInfo;
+------------+------------------+---------------+
| officeCode | phone | city |
+------------+------------------+---------------+
| 1 | +1 650 219 4782 | San Francisco |
| 2 | +1 215 837 0825 | Boston |
| 3 | +1 212 555 3000 | NYC |
| 4 | +33 14 723 4404 | Paris |
| 5 | +86 33 224 5000 | Beijing |
| 6 | +61 2 9264 2451 | Sydney |
| 7 | +44 20 7877 2041 | London |
+------------+------------------+---------------+
7 rows in set
然後,使用以下UPDATE語句通過officeInfo視
圖更改officeCode
的值為:4
的辦公室電話號碼。
UPDATE officeInfo
SET
phone = '+86 089866668888'
WHERE
officeCode = 4;
最後,驗證更改結果,通過執行以下查詢來查詢officeInfo
視圖中的數據:
mysql> SELECT
*
FROM
officeInfo
WHERE
officeCode = 4;
+------------+------------------+-------+
| officeCode | phone | city |
+------------+------------------+-------+
| 4 | +86 089866668888 | Paris |
+------------+------------------+-------+
1 row in set
檢查可更新視圖資訊
通過從information_schema
資料庫中的views
表查詢is_updatable
列來檢查資料庫中的視圖是否可更新。
以下查詢語句將查詢zaixiandb
資料庫獲取所有視圖,並顯示哪些視圖是可更新的。
SELECT
table_name, is_updatable
FROM
information_schema.views
WHERE
table_schema = 'zaixiandb';
執行上面查詢語句,得到以下結果 -
+------------------+--------------+
| table_name | is_updatable |
+------------------+--------------+
| aboveavgproducts | YES |
| bigsalesorder | YES |
| customerorders | NO |
| officeinfo | YES |
| saleperorder | NO |
+------------------+--------------+
5 rows in set
通過視圖刪除行
首先,創建一個名為items
的表,在items
表中插入一些行,並創建一個查詢包含價格大於700
的項的視圖。
USE testdb;
-- create a new table named items
CREATE TABLE items (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
price DECIMAL(11 , 2 ) NOT NULL
);
-- insert data into the items table
INSERT INTO items(name,price)
VALUES('Laptop',700.56),('Desktop',699.99),('iPad',700.50) ;
-- create a view based on items table
CREATE VIEW LuxuryItems AS
SELECT
*
FROM
items
WHERE
price > 700;
-- query data from the LuxuryItems view
SELECT
*
FROM
LuxuryItems;
執行上面查詢語句後,得到以下結果 -
+----+--------+--------+
| id | name | price |
+----+--------+--------+
| 1 | Laptop | 700.56 |
| 3 | iPad | 700.5 |
+----+--------+--------+
2 rows in set
其次,使用DELETE
語句來刪除id
為3
的行。
DELETE FROM LuxuryItems
WHERE
id = 3;
MySQL返回一條消息,表示有1
行受到影響。
Query OK, 1 row affected
第三步,再次通過視圖檢查數據。
mysql> SELECT * FROM LuxuryItems;
+----+--------+--------+
| id | name | price |
+----+--------+--------+
| 1 | Laptop | 700.56 |
+----+--------+--------+
1 row in set
第四步,還可以從基表items
查詢數據,以驗證DELETE
語句是否實際刪除了該行。
mysql> SELECT * FROM items;
+----+---------+--------+
| id | name | price |
+----+---------+--------+
| 1 | Laptop | 700.56 |
| 2 | Desktop | 699.99 |
+----+---------+--------+
2 rows in set
如上面所示,ID
為3
的行在基表中被刪除。
在本教學中,我們向您展示了如何通過創建可更新視圖,並更新基礎表中的數據。