mysql檢視之建立可更新檢視的方法詳解
本文例項講述了mysql檢視之建立可更新檢視的方法。分享給大家供大家參考,具體如下:
我們知道,在mysql中,檢視不僅是可查詢的,而且是可更新的。這意味著我們可以使用insert或update語句通過可更新檢視插入或更新基表的行。 另外,我們還可以使用delete語句通過檢視刪除底層表的行。但是,要建立可更新檢視,定義檢視的select語句不能包含以下任何元素:
- 聚合函式,如:min,max,sum,avg,count等。
- DISTINCT子句
- GROUP BY子句
- HAVING子句
- 左連線或外連線。
- UNION或UNION ALL子句
- SELECT子句中的子查詢或引用該表的where子句中的子查詢出現在FROM子句中。
- 引用FROM子句中的不可更新檢視
- 僅引用文字值
- 對基表的任何列的多次引用
我們如果使用temptable演算法建立檢視,則無法更新檢視,不過有時可以使用內部連線建立基於多個表的可更新檢視。廢話不多說,讓我們先來看看如何建立一個可更新的檢視。我們先來嘗試基於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列來檢查資料庫中的檢視是否可更新,比如,我們來查詢luyaran資料庫獲取所有檢視,並顯示哪些檢視是可更新的:
SELECT table_name,is_updatable FROM information_schema.views WHERE table_schema = 'luyaran';
執行上面查詢語句,得到以下結果:
+------------------+--------------+ | 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的行在基表中被刪除。
好啦,本次記錄就到這裡了。
更多關於MySQL相關內容感興趣的讀者可檢視本站專題:《MySQL查詢技巧大全》、《MySQL事務操作技巧彙總》、《MySQL儲存過程技巧大全》、《MySQL資料庫鎖相關技巧彙總》及《MySQL常用函式大彙總》
希望本文所述對大家MySQL資料庫計有所幫助。