java学习之路——第四十五天

视图:视图是由查询结果形成的一张虚拟表 ,并不是我们自行创建的表,而是将一个频繁的查询结果当成一张临时表来用。

语法:create view as select 语句

为什么要有视图?

1、可以简化查询

2、可以进行权限控制

         把表的权限封闭,但是开发相应的视图权限,视图里只开放部分数据

3、大数据分表时可以用到

         拆表

 

视图与表的关系:

         视图是表的查询结果,自然表的数据改变了,影响视图的结果

 

视图必须包含表中没有默认值也不能为空的列

 

触发器:trigger 一触即发

作用:监视某种情况并触发某种操作

四要素:监视地点   监视事件    触发时间    触发事件

语法:

create trigger 触发器名

         触发时间 触发事件  on  监视地点

         for each  row(固定写法)

         begin

         表数据的操作语句,

         end;

因为sql语句默认是以;结尾,所以在使用触发器的时候需要将结束符修改一下

修改结束符的语句:delimiter $ (设置$为结束符)

 

触发事件:after  before

区别:after是先完成数据的增删改再触发,触发的语句晚于监视的增删改们无法影响前面的增删改动作

before是先完成触发,再增删改,触发的语句先于增删改发生,我们有机会判断,修改即将发生的操作。

 

案例:# 视图

# 语法:create view 视图名 as select 语句;

CREATE TABLE person(

  id INT PRIMARY KEY AUTO_INCREMENT,

  NAME CHAR(10),

  age INT

);

INSERT INTO person(NAME,age) VALUES('张三',12),('李四',13),('王五',23),('马六',24);

 

CREATE VIEW view1 AS SELECT NAME FROM person;

 

-- 原表发生改变,视图会不会发生改变

INSERT INTO person(NAME,age) VALUES ('xm',22);

 

-- 视图发生改变 ,原表会不会发生改变

DELETE FROM view1 WHERE NAME='xm';

 

 

CREATE TABLE g(

   id INT,

   NAME VARCHAR(10),

   num INT

)CHARSET utf8;

 

CREATE TABLE o(

   oid INT,

   gid INT,

   much INT

)CHARSET utf8;

 

INSERT INTO g VALUES(1,'猪',22),

(2,'羊',19),(3,'狗',12),(4,'猫',8);

 

 

#1.添加订单,库存减少

 

-- 创建一个触发器

DELIMITER $

CREATE TRIGGER tg1

AFTER INSERT ON o

FOR EACH ROW

BEGIN

UPDATE g SET num = num - new.much WHERE id=new.gid;

END$

 

-- 添加订单

INSERT INTO o VALUES(2,3,3);

 

-- 删除订单库存增加

DELIMITER $

CREATE TRIGGER tg2

AFTER DELETE ON o

FOR EACH ROW

BEGIN

UPDATE g SET num = num + old.much WHERE id=old.gid;

END$

 

DELETE FROM o WHERE oid=2;

 

-- 修改订单的数量时,库存相应改变

DELIMITER $

CREATE TRIGGER tg3

AFTER UPDATE ON o

FOR EACH ROW

BEGIN

UPDATE g SET num=num+old.much-new.much WHERE id=old.gid;

END$

 

UPDATE o SET much=1 WHERE oid=1;

 

-- 强制把订单的商品数量改成5

DELIMITER $

CREATE TRIGGER tg4

BEFORE INSERT ON o

FOR EACH ROW

BEGIN

IF new.much>5 THEN

SET new.much=5;

END IF;

UPDATE g SET num=num-new.much WHERE id=new.gid;

END$

 

-- 添加订单

INSERT INTO o VALUES(1,1,10);

猜你喜欢

转载自blog.csdn.net/mataodehtml/article/details/85244784