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('Lap',700.56),('Desk',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 | Lap | 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 | Lap | 700.56 | +----+--------+--------+ 1 row in set
我们还可以从基表items查询数据,以验证DELETE语句是否实际删除了该行
mysql> SELECT FROM items; +----+---------+--------+ | id | name | price | +----+---------+--------+ | 1 | Lap | 700.56 | | 2 | Desk | 699.99 | +----+---------+--------+ 2 rows in set
我们可以看到,ID为3的行在基表中被删除。
好啦,本次记录就到这里了。
更多关于MySQL相关内容感兴趣的读者可查看本站专题《》、《》、《》、《》及《》
希望本文所述对大家MySQL数据库计有所帮助。
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程