mysql视图之创建可更新视图的方法详解
本文实例讲述了mysql视图之创建可更新视图的方法。分享给大家供大家参考,具体如下:
我们知道,在mysql中,视图不仅是可查询的,而且是可更新的。这意味着我们可以使用insert或update语句通过可更新视图插入或更新基表的行。另外,我们还可以使用delete语句通过视图删除底层表的行。但是,要创建可更新视图,定义视图的select语句不能包含以下任何元素:
- 聚合函数,如:min,max,sum,avg,count等。
- DISTINCT子句
- GROUPBY子句
- HAVING子句
- 左连接或外连接。
- UNION或UNIONALL子句
- SELECT子句中的子查询或引用该表的where子句中的子查询出现在FROM子句中。
- 引用FROM子句中的不可更新视图
- 仅引用文字值
- 对基表的任何列的多次引用
我们如果使用temptable算法创建视图,则无法更新视图,不过有时可以使用内部连接创建基于多个表的可更新视图。废话不多说,让我们先来看看如何创建一个可更新的视图。我们先来尝试基于offices表创建一个名为officeInfo的视图,它指的是offices表中的三列:officeCode,phone和city:
CREATEVIEWofficeInfo AS SELECTofficeCode,phone,city FROMoffices;
接下来,使用以下语句从officeInfo视图中查询数据:
SELECT * FROM officeInfo;
执行上面查询语句,得到以下结果:
mysql>SELECT*FROMofficeInfo; +------------+------------------+---------------+ |officeCode|phone|city| +------------+------------------+---------------+ |1|+16502194782|SanFrancisco| |2|+12158370825|Boston| |3|+12125553000|NYC| |4|+33147234404|Paris| |5|+86332245000|Beijing| |6|+61292642451|Sydney| |7|+442078772041|London| +------------+------------------+---------------+ 7rowsinset
然后,使用以下update语句通过officeInfo视图更改officeCode的值为:4的办公室电话号码:
UPDATEofficeInfo SET phone='+86089866668888' WHERE officeCode=4;
最后,验证更改结果,通过执行以下查询来查询officeInfo视图中的数据:
mysql>SELECT * FROM officeInfo WHERE officeCode=4;
+------------+------------------+-------+ |officeCode|phone|city| +------------+------------------+-------+ |4|+86089866668888|Paris| +------------+------------------+-------+ 1rowinset
完事我们可以通过从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| +------------------+--------------+ 5rowsinset
我们再来尝试通过视图删除行,首先,创建一个名为items的表,在items表中插入一些行,并创建一个查询包含价格大于700的项的视图:
USEtestdb; --createanewtablenameditems CREATETABLEitems( idINTAUTO_INCREMENTPRIMARYKEY, nameVARCHAR(100)NOTNULL, priceDECIMAL(11,2)NOTNULL ); --insertdataintotheitemstable INSERTINTOitems(name,price) VALUES('Laptop',700.56),('Desktop',699.99),('iPad',700.50); --createaviewbasedonitemstable CREATEVIEWLuxuryItemsAS SELECT * FROM items WHERE price>700; --querydatafromtheLuxuryItemsview SELECT * FROM LuxuryItems;
执行上面查询语句后,得到以下结果:
+----+--------+--------+ |id|name|price| +----+--------+--------+ |1|Laptop|700.56| |3|iPad|700.5| +----+--------+--------+ 2rowsinset
完事使用DELETE语句来删除id为3的行:
DELETEFROMLuxuryItems WHERE id=3;
mysql返回一条消息,表示有1行受到影响:
QueryOK,1rowaffected
我们来再次通过视图检查数据:
mysql>SELECT*FROMLuxuryItems; +----+--------+--------+ |id|name|price| +----+--------+--------+ |1|Laptop|700.56| +----+--------+--------+ 1rowinset
我们还可以从基表items查询数据,以验证DELETE语句是否实际删除了该行:
mysql>SELECT*FROMitems; +----+---------+--------+ |id|name|price| +----+---------+--------+ |1|Laptop|700.56| |2|Desktop|699.99| +----+---------+--------+ 2rowsinset
我们可以看到,ID为3的行在基表中被删除。
好啦,本次记录就到这里了。
更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL查询技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》、《MySQL数据库锁相关技巧汇总》及《MySQL常用函数大汇总》
希望本文所述对大家MySQL数据库计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。