MariaDB 视图与触发器(11)
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可MariaDB的目的是完全兼容MySQL,包括API和命令行,MySQL由于现在闭源了,而能轻松成为MySQL的代替品.在存储引擎方面,使用XtraDB来代替MySQL的InnoDB,MariaDB由MySQL的创始人Michael Widenius主导开发,他早前曾以10亿美元的价格,将自己创建的公司MySQL AB卖给了SUN,此后,随着SUN被甲骨文收购MySQL的所有权也落入Oracle的手中.MariaDB名称来自MichaelWidenius的女儿Maria的名字.
数据库中的视图是一个虚拟表,同真实的表一样,视图包含一系列带有名称的行和列数据,行和列数据来自由定义视图查询所引用的表,并且在引用视图时动态生成,视图是从一个或者多个表中导出的,视图的行为与表非常相似,但视图是一个虚拟表.在视图中用户可以使用SELECT
语句查询数据,以及使用INSERT、UPDATE和DELETE
修改记录,视图可以使用户操作方便,而且可以保障数据库系统的安全.
触发器和存储过程一样,都是嵌入到MySQL的一段程序,触发器是由事件来触发某个操作,这些事件包括INSERT、UPDATAE和DELETE语句
.如果定义了触发程序,当数据库执行这些语句的时候就会激发触发器执行相应的操作,触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象.
MariaDB 视图
视图的含义:
视图是一张虚拟表,是从数据库中一个或多个表中导出来的表,视图还可以从已经存在的视图基础上定义,视图一经定义便存储在数据库中,与其相对应的数据并没有像表那样在数据库中再存储一份,通过视图看到的数据只是存放在基本表中的数据.对视图的操作与对表的操作一样,可以对其进行查询、修改和删除.当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化.同时,若基本表的数据发生变化,则这种变化也可以自动地反映到视图中.
如下小例子:下面有个student表
和 info表
,现在我分别只想去除其中的ID号,姓名,班级
,此时我们就需要用一个视图来解决,取出指定的字段.
create table student (s_id int,name varchar(40));
create table info (s_id int,glass varchar(40),addr varchar(90));
视图提供了一个很好的解决方法,创建视图的信息来自表的部分信息,只取出需要的信息,这样既能满足需求也不破坏原有的表结构.
视图的作用:
视图不仅可以简化用户对于数据的理解,也可以简化他们的操作,那些被经常使用的查询可以定义为视图,从而使得用户不必为以后的操作每次指定全部条件.
通过视图用户只能查询和修改他们所能见到的数据,数据库中的其他数据则既看不见也取不到,数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定行和特定的列上.通过视图,用户可以被限制在数据的不同子集上.
◆创建视图◆
在单表上创建视图:
1.首先创建一个基本表table1
并插入测试数据.
MariaDB [lyshark]> create table table1(quantity INT,price INT);
Query OK, 0 rows affected (0.02 sec)MariaDB [lyshark]> insert into table1 values(1,10);
Query OK, 1 row affected (0.00 sec)MariaDB [lyshark]> insert into table1 values(2,30);
Query OK, 1 row affected (0.00 sec)MariaDB [lyshark]> insert into table1 values(3,50);
Query OK, 1 row affected (0.00 sec)
2.创建视图,在table1
表上创建一个view_tab1
视图,其中代码有三个字段x,y,totle
,SQL语句如下:
MariaDB [lyshark]> create view view_tab1(x,y,totle)-> AS SELECT quantity,price,quantity * price-> FROM table1;
Query OK, 0 rows affected (0.00 sec)
3.紧接着我们使用视图来查询创建的新表格.
MariaDB [lyshark]> select * from view_tab1;
+------+------+-------+
| x | y | totle |
+------+------+-------+
| 1 | 10 | 10 |
| 2 | 30 | 60 |
| 3 | 50 | 150 |
+------+------+-------+
3 rows in set (0.00 sec)
在多张表上创建视图:
1.首先创建两个测试表并插入一些数据,这里我们就创建要给student
和info
两个表,SQL语句如下:
MariaDB [lyshark]> create table student-> (-> s_id INT,-> name VARCHAR(40)-> );
Query OK, 0 rows affected (0.01 sec)MariaDB [lyshark]> create table info-> (-> s_id INT,-> glass VARCHAR(40),-> addr VARCHAR(90)-> );
Query OK, 0 rows affected (0.00 sec)MariaDB [lyshark]> insert into student values(1,'wang'),(2,'rui');
Query OK, 2 rows affected (0.33 sec)
Records: 2 Duplicates: 0 Warnings: 0MariaDB [lyshark]> insert into info values(1,'wuban','henan'),(2,'sanban','hebei'),(3,'yiban','s
handong');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
2.接下来我们创建一个视图stu_glass
,其中有三个参数(id,name,glass),分别对应两个表的不同字段,并且通过where条件
限定ID号相同的关联在一起.
MariaDB [lyshark]> create view stu_glass(id,name,glass)-> AS select student.s_id,student.name,info.glass-> FROM student,info where student.s_id = info.s_id;Query OK, 0 rows affected (0.00 sec)MariaDB [lyshark]> select * from stu_glass;
+------+------+--------+
| id | name | glass |
+------+------+--------+
| 1 | wang | wuban |
| 2 | rui | sanban |
+------+------+--------+
2 rows in set (0.01 sec)
以上例子就解决了刚开始那个问题,通过这个视图可以很好地保护基本表中的数据.
◆查看视图◆
使用desc查看视图表结构:
MariaDB [lyshark]> desc stu_glass;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(40) | YES | | NULL | |
| glass | varchar(40) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
使用show table status查看视图:
MariaDB [lyshark]> show table status like 'stu_glass' \G
*************************** 1. row ***************************Name: stu_glassEngine: NULLVersion: NULLRow_format: NULLRows: NULLAvg_row_length: NULLData_length: NULL
Max_data_length: NULLIndex_length: NULLData_free: NULLAuto_increment: NULLCreate_time: NULLUpdate_time: NULLCheck_time: NULLCollation: NULLChecksum: NULLCreate_options: NULLComment: VIEW
1 row in set (0.00 sec)
使用show create view查看视图详细信息:
MariaDB [lyshark]> show create view stu_glass \G
*************************** 1. row ***************************View: stu_glassCreate View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `stu_glass` AS select `student`.`s_id` AS `id`,`student`.`name` AS `name`,`info`.`glass` AS `glass` from (`student` join `info`) where (`student`.`s_id` = `info`.`s_id`)
character_set_client: utf8
collation_connection: utf8_general_ci
1 row in set (0.00 sec)MariaDB [lyshark]>
在views表中查看视图详细信息:
MariaDB [lyshark]> select * from information_schema.views; #查视图
MariaDB [lyshark]> select * from information_schema.tables; #查表
+---------------+--------------+------------+
| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME |
+---------------+--------------+------------+
| def | lyshark | stu_glass |
| def | lyshark | view_tab1 |
| def | lyshark | view_tab2 |
+---------------+--------------+------------+
3 rows in set (0.01 sec)
◆更新与删除视图◆
alter语句修改视图:
使用alter语句,修改视图view_tab1
,SQL语句如下:
MariaDB [lyshark]> desc view_tab1;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| x | int(11) | YES | | NULL | |
| y | int(11) | YES | | NULL | |
| totle | bigint(21) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
3 rows in set (0.00 sec)MariaDB [lyshark]> alter view view_tab1-> AS select quantity from table1;
Query OK, 0 rows affected (0.00 sec)MariaDB [lyshark]> desc view_tab1;
+----------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| quantity | int(11) | YES | | NULL | |
+----------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
update更新视图:
MariaDB [lyshark]> select * from stu_glass;
+------+------+--------+
| id | name | glass |
+------+------+--------+
| 1 | wang | wuban |
| 2 | rui | sanban |
+------+------+--------+
2 rows in set (0.00 sec)MariaDB [lyshark]> update stu_glass SET id=3 where name="rui";
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 0MariaDB [lyshark]> select * from stu_glass;
+------+------+-------+
| id | name | glass |
+------+------+-------+
| 1 | wang | wuban |
| 3 | rui | yiban |
+------+------+-------+
2 rows in set (0.00 sec)
删除视图中指定字段:注意,联合字段的视图无法删除.
MariaDB [lyshark]> select * from view_tab1;
+------+------+-------+
| x | y | totle |
+------+------+-------+
| 1 | 10 | 10 |
| 2 | 30 | 60 |
| 3 | 50 | 150 |
+------+------+-------+
3 rows in set (0.00 sec)MariaDB [lyshark]> delete from view_tab1 where x=1;
Query OK, 1 row affected (0.00 sec)MariaDB [lyshark]> select * from view_tab1;
+------+------+-------+
| x | y | totle |
+------+------+-------+
| 2 | 30 | 60 |
| 3 | 50 | 150 |
+------+------+-------+
2 rows in set (0.00 sec)
删除一个视图:
1.查询一下,我们比如要删除view_tab1
和view_tab2
两个视图.
MariaDB [lyshark]> select * from information_schema.views; #查视图
+---------------+--------------+------------+
| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME |
+---------------+--------------+------------+
| def | lyshark | stu_glass |
| def | lyshark | view_tab1 |
| def | lyshark | view_tab2 |
+---------------+--------------+------------+
3 rows in set (0.01 sec)
2.通过drop view
语句直接删除掉.
MariaDB [lyshark]> drop view if exists view_tab1;
Query OK, 0 rows affected (0.00 sec)MariaDB [lyshark]> drop view if exists view_tab2;
Query OK, 0 rows affected (0.00 sec)
3.再次查询,发现没有了,删除成功.
MariaDB [lyshark]> select * from information_schema.views;
+---------------+--------------+------------+
| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME |
+---------------+--------------+------------+
| def | lyshark | stu_glass |
+---------------+--------------+------------+
1 row in set (0.00 sec)
MariaDB触发器
触发器(Trigger)是个特殊的存储过程,不同的是,执行存储过程要使用CALL语句来调用,而触发器的执行不需要使用CALL语句来调用,也不需要手工启动,只要当一个预定义的事件发生的时候,就会被MySQL自动调用,触发器可以查询其他表,而且可以包含复杂的SQL语句,它们主要用于满足复杂的业务规则或要求.
一般来说创建触发器的基本语法如下:
create trigger trigger_name trigger_time trigger_event
ON table_name FOR EACH ROW trigger_stmt#----------------------------------------------------------------
#[参数解释]trigger_name #触发器名称
trigger_time #标识触发时机(befor/after)
trigger_event #标识触发事件
table_name #建立触发器表名,即在那张表上建立触发器
trigger_stmt #触发器执行语句
而创建多个执行语句的触发器的语法如下:
create trigger trigger_name trigger_time trigger_event
ON table_name FOR EACH ROW
BEGIN
执行语句块...
END
◆创建触发器◆
创建只有一条执行语句的触发器:
1.首先创建一个account表
,表中有两个字段,分别是acct_num字段(INT)
,amount字段(float)
.
MariaDB [lyshark]> create table account(acct_num INT,amount DECIMAL(10,2));
Query OK, 0 rows affected (0.01 sec)MariaDB [lyshark]> desc account;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| acct_num | int(11) | YES | | NULL | |
| amount | decimal(10,2) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
2.创建一个名为ins_sum
的触发器,触发条件是向数据表account
插入数据之前,对新插入的amount
字段值进行求和计算.
MariaDB [lyshark]> create trigger ins_sum BEFORE INSERT ON account-> FOR EACH ROW SET @sum=@sum+NEW.amount;
Query OK, 0 rows affected (0.00 sec)MariaDB [lyshark]> set @sum=0;
Query OK, 0 rows affected (0.00 sec)MariaDB [lyshark]> insert into account values(1,1.00),(2,2.00);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0MariaDB [lyshark]> select @sum;
+------+
| @sum |
+------+
| 3.00 |
+------+
1 row in set (0.00 sec)
以上例子,首先创建一个account
表,再向表account
插入数据之前,计算所有新插入的account
表的amount
值之和,触发器的名称为ins_sum
,条件是在向表中插入数据之前触发.
创建具有多条执行语句的触发器:
1.首相创建4个测试表格,并写入以下测试字段.
MariaDB [lyshark]> create table test1(a1 INT);
Query OK, 0 rows affected (0.00 sec)MariaDB [lyshark]> create table test2(a2 INT);
Query OK, 0 rows affected (0.00 sec)MariaDB [lyshark]> create table test3(a3 INT NOT NULL AUTO_INCREMENT primary key);
Query OK, 0 rows affected (0.00 sec)MariaDB [lyshark]> create table test4(-> a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,-> b4 INT DEFAULT 0-> );
Query OK, 0 rows affected (0.07 sec)
2.创建一个包含多个执行语句的触发器,当test1
有数据插入时,执行触发语句,代码如下:
MariaDB [lyshark]> DELIMITER //
MariaDB [lyshark]> create trigger testref BEFORE INSERT ON test1-> FOR EACH ROW-> BEGIN-> insert into test2 set a2=NEW.a1;-> delete from test3 where a3=NEW.a1;-> update test4 set b4=b4+1 where a4=NEW.a1;-> END-> //
MariaDB [lyshark]> DELIMITER ;;
以上代码创建了一个名为testref
的触发器,这个触发器的触发条件是在向表test1
插入数据前执行触发器的语句,具体执行代码如下:
MariaDB [lyshark]> insert into test1 values (1),(3),(1),(7),(1),(4);
Query OK, 6 rows affected (0.01 sec)
Records: 6 Duplicates: 0 Warnings: 0
当test1表格插入数据后,其他表格也会出现相同的数据,这就是触发器所做的贡献.
MariaDB [lyshark]> select * from test1;
+------+
| a1 |
+------+
| 1 |
| 3 |
| 1 |
| 7 |
| 1 |
| 4 |
+------+
6 rows in set (0.00 sec)MariaDB [lyshark]> select * from test2;
+------+
| a2 |
+------+
| 1 |
| 3 |
| 1 |
| 7 |
| 1 |
| 4 |
+------+
6 rows in set (0.00 sec)
关于触发器的另一个小实验:
1.先来创建一个数据表.
MariaDB [lyshark]> create table myevent(id int,name char(20));
Query OK, 0 rows affected (0.01 sec)MariaDB [lyshark]> desc myevent;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | char(20) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
2.创建一个trig_insert
的触发器,在向表account
插入数据之后会向表myevent
插入一组数据,代码如下:
MariaDB [lyshark]> create trigger trig_insert AFTER INSERT ON account-> FOR EACH ROW INSERT INTO myevent values(2,'after insert');
Query OK, 0 rows affected (0.00 sec)
3.此时我们执行插入语句,向account
表插入数据,查询myevent
表,发现自动添加上了,说明触发器生效了.
MariaDB [lyshark]> insert into account values(1,1.00),(2,2.00);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0MariaDB [lyshark]> select * from myevent;
+------+--------------+
| id | name |
+------+--------------+
| 2 | after insert |
| 2 | after insert |
+------+--------------+
2 rows in set (0.00 sec)
◆查看与删除触发器◆
show triggers 查看所有触发器:
MariaDB [lyshark]> show triggers \G;
*************************** 1. row ***************************Trigger: ins_sumEvent: INSERTTable: accountStatement: SET @sum=@sum+NEW.amountTiming: BEFORECreated: NULLsql_mode:Definer: root@localhost
character_set_client: utf8
collation_connection: utf8_general_ciDatabase Collation: latin1_swedish_ci
*************************** 2. row ***************************Trigger: trig_insertEvent: INSERTTable: accountStatement: INSERT INTO myevent values(2,'after insert')Timing: AFTERCreated: NULLsql_mode:Definer: root@localhost
character_set_client: utf8
collation_connection: utf8_general_ciDatabase Collation: latin1_swedish_ci
在triggers表中查看触发器:
MariaDB [lyshark]> select * from information_schema.triggers \G;*************************** 1. row ***************************TRIGGER_CATALOG: defTRIGGER_SCHEMA: lysharkTRIGGER_NAME: ins_sumEVENT_MANIPULATION: INSERTEVENT_OBJECT_CATALOG: defEVENT_OBJECT_SCHEMA: lysharkEVENT_OBJECT_TABLE: accountACTION_ORDER: 0ACTION_CONDITION: NULLACTION_STATEMENT: SET @sum=@sum+NEW.amountACTION_ORIENTATION: ROWACTION_TIMING: BEFORE
ACTION_REFERENCE_OLD_TABLE: NULL
ACTION_REFERENCE_NEW_TABLE: NULLACTION_REFERENCE_OLD_ROW: OLDACTION_REFERENCE_NEW_ROW: NEWCREATED: NULLSQL_MODE:DEFINER: root@localhostCHARACTER_SET_CLIENT: utf8COLLATION_CONNECTION: utf8_general_ciDATABASE_COLLATION: latin1_swedish_ci
删除触发器: 删除lyshark
数据库中的,ins
触发器,SQL如下:
1.先查询一下触发器的名称,SQL语句如下:
MariaDB [lyshark]> select TRIGGER_SCHEMA,TRIGGER_NAME from information_schema.triggers;
+----------------+--------------+
| TRIGGER_SCHEMA | TRIGGER_NAME |
+----------------+--------------+
| lyshark | ins_sum |
| lyshark | trig_insert |
| lyshark | testref |
+----------------+--------------+
3 rows in set (0.00 sec)
2.一条命令删除.
MariaDB [lyshark]> drop trigger lyshark.ins_sum;
Query OK, 0 rows affected (0.00 sec)
转载于:https://www.cnblogs.com/LyShark/p/10197881.html
MariaDB 视图与触发器(11)相关推荐
- MariaDB 视图与触发器
数据库中的视图是一个虚拟表,同真实的表一样,视图包含一系列带有名称的行和列数据,行和列数据来自由定义视图查询所引用的表,并且在引用视图时动态生成,视图是从一个或者多个表中导出的,视图的行为与表非常相似 ...
- mysql七:视图、触发器、事务、存储过程、函数
阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名 ...
- MySQL— 索引,视图,触发器,函数,存储过程,执行计划,慢日志,分页性能...
一.索引,分页性能,执行计划,慢日志 (1)索引的种类,创建语句,名词补充(最左前缀匹配,覆盖索引,索引合并,局部索引等): import sys # http://www.cnblogs.com/w ...
- mysql视图存储过程触发器
以下笔记借鉴于黑马MYSQL视频,记录为个人学习笔记参考. 包含视图/存储过程/触发器等概念 目录 视图 view 语法 视图的检查选项 视图更新 作用 存储过程 procedure 语法 变量 系统 ...
- MySQL(学习笔记)——数据库视图、触发器及存储过程
数据库视图.触发器及存储过程 1.什么是视图 定义:视图是从数据库中一个或多个表中导出来的虚拟表,不在内存中. 语法: create view 视图名 //(创建一张视图) as sele ...
- 【数据库】视图,触发器,存储过程
数据库笔记 day04 2019/8/23 周五 学习内容:视图,触发器,存储过程,变量,if else语句,范式 关键字:create view:describe:select:drop:delim ...
- mysql命令行查看表的触发器_Mysql事项,视图,函数,触发器命令(详解)
事项开启和使用 //修改表的引擎 alter table a engine=myisam; //开启事务 begin; //关闭自动提交 set autocommit=0; //扣100 update ...
- oracle删除所有触发器的命令,Oracle删除当前用户的所有对象(表、视图、触发器、存储过程、函数)...
Oracle删除当前用户的所有对象(表.视图.触发器.存储过程.函数) 1. DECLARE TYPE name_list IS TABLE OF VARCHAR2(40); TYPE type_li ...
- mysql存储过程输入参数拆分_一文看懂mysql数据库存储过程、函数、视图、触发器、表...
概述 抽空总结一下mysql的一些概念性内容,涉及存储过程.函数.视图.触发器等. 一.查看存储过程.函数.视图.触发器.表 1.存储过程 select * from mysql.proc where ...
最新文章
- WSS 3.0 Object Model
- 冒泡排序 选择排序 快速排序(C语言)
- Python之sklearn2pmml:sklearn2pmml库函数的简介、安装、使用方法之详细攻略
- SAP UI5 应用开发教程之六 - 了解 SAP UI5 的模块(Module)概念
- docker 及 docker-compose 的快速安装和简单使用
- 2019年最好用的6款数据库监控工具
- plc和pc串口通讯接线_PLC与PC机之间的串行通信
- 国产操作系统思普将起诉微软涉嫌“商业诋毁”
- HTML基础编程——简介及第一行代码
- 日记侠:要赚钱千万别多想立刻开干
- django 1.8 mysql_mysql - 升级1.7.4到django 1.8 south.db.mysql错误,不使用南 - 堆栈内存溢出...
- qt:cannot open C:\Users\某某某\AppData\Local\Temp\main.obj.15576.16.jom for write
- 大型情感连续剧,从焫鷄到咸鱼
- Handler之创建子线程Handler
- 王迪手机软件测试,王迪的作品集 - 新片场
- 商业智能BI企业管理决策之经营管理会议
- hiho1718(LIS)
- 北京内推 | 字节跳动AML机器学习系统团队招聘机器学习训练框架研发实习生
- xStream:Security framework of XStream not initialized, XStream is probably vulnerable
- 【算法设计与分析】活动安排问题(动态规划和贪心算法)