当前位置 博文首页 > mataodehtml的博客:java学习之路——第四十五天

    mataodehtml的博客:java学习之路——第四十五天

    作者:[db:作者] 时间:2021-08-11 09:45

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

    语法: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);

    cs