本文實(shí)例講述了MySQL視圖之創(chuàng)建可更新視圖的方法。分享給大家供大家參考,具體如下:
專注于為中小企業(yè)提供網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)常熟免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了成百上千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
我們知道,在mysql中,視圖不僅是可查詢的,而且是可更新的。這意味著我們可以使用insert或update語句通過可更新視圖插入或更新基表的行。 另外,我們還可以使用delete語句通過視圖刪除底層表的行。但是,要?jiǎng)?chuàng)建可更新視圖,定義視圖的select語句不能包含以下任何元素:
我們?nèi)绻褂胻emptable算法創(chuàng)建視圖,則無法更新視圖,不過有時(shí)可以使用內(nèi)部連接創(chuàng)建基于多個(gè)表的可更新視圖。廢話不多說,讓我們先來看看如何創(chuàng)建一個(gè)可更新的視圖。我們先來嘗試基于offices表創(chuàng)建一個(gè)名為officeInfo的視圖,它指的是offices表中的三列:officeCode,phone 和 city:
CREATE VIEW officeInfo AS SELECT officeCode, phone, city FROM offices;
接下來,使用以下語句從officeInfo視圖中查詢數(shù)據(jù):
SELECT * FROM officeInfo;
執(zhí)行上面查詢語句,得到以下結(jié)果:
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的辦公室電話號(hào)碼:
UPDATE officeInfo SET phone = '+86 089866668888' WHERE officeCode = 4;
最后,驗(yàn)證更改結(jié)果,通過執(zhí)行以下查詢來查詢officeInfo視圖中的數(shù)據(jù):
mysql> SELECT * FROM officeInfo WHERE officeCode = 4;
+------------+------------------+-------+ | officeCode | phone | city | +------------+------------------+-------+ | 4 | +86 089866668888 | Paris | +------------+------------------+-------+ 1 row in set
完事我們可以通過從information_schema數(shù)據(jù)庫中的views表查詢is_updatable列來檢查數(shù)據(jù)庫中的視圖是否可更新,比如,我們來查詢luyaran數(shù)據(jù)庫獲取所有視圖,并顯示哪些視圖是可更新的:
SELECT table_name, is_updatable FROM information_schema.views WHERE table_schema = 'luyaran';
執(zhí)行上面查詢語句,得到以下結(jié)果:
+------------------+--------------+ | table_name | is_updatable | +------------------+--------------+ | aboveavgproducts | YES | | bigsalesorder | YES | | customerorders | NO | | officeinfo | YES | | saleperorder | NO | +------------------+--------------+ 5 rows in set
我們?cè)賮韲L試通過視圖刪除行,首先,創(chuàng)建一個(gè)名為items的表,在items表中插入一些行,并創(chuàng)建一個(gè)查詢包含價(jià)格大于700的項(xiàng)的視圖:
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;
執(zhí)行上面查詢語句后,得到以下結(jié)果:
+----+--------+--------+ | 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
我們來再次通過視圖檢查數(shù)據(jù):
mysql> SELECT * FROM LuxuryItems; +----+--------+--------+ | id | name | price | +----+--------+--------+ | 1 | Laptop | 700.56 | +----+--------+--------+ 1 row in set
我們還可以從基表items查詢數(shù)據(jù),以驗(yàn)證DELETE語句是否實(shí)際刪除了該行:
mysql> SELECT * FROM items; +----+---------+--------+ | id | name | price | +----+---------+--------+ | 1 | Laptop | 700.56 | | 2 | Desktop | 699.99 | +----+---------+--------+ 2 rows in set
我們可以看到,ID為3的行在基表中被刪除。
好啦,本次記錄就到這里了。
更多關(guān)于MySQL相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《MySQL查詢技巧大全》、《MySQL事務(wù)操作技巧匯總》、《MySQL存儲(chǔ)過程技巧大全》、《MySQL數(shù)據(jù)庫鎖相關(guān)技巧匯總》及《MySQL常用函數(shù)大匯總》
希望本文所述對(duì)大家MySQL數(shù)據(jù)庫計(jì)有所幫助。