您的位置:新葡亰496net > 网络数据库 > 新葡亰496netMysql - 触发器/视图

新葡亰496netMysql - 触发器/视图

发布时间:2019-11-15 13:00编辑:网络数据库浏览(183)

    触发器在头里的档期的顺序中, 应用的实在相当的少, 未有章程的时候, 才会去用那几个. 因为那么些事物在中期并不怎么好爱慕, 也易于造成零乱.

    mysql 触发器(trigger),mysqltrigger

    触发器(trigger):监视某种意况,并触及某种操作。

    触发器创造语法四要素:1.监视地点(table) 2.蹲点事件(insert/update/delete) 3.触及时间(after/before) 4.触发事件

    语法:

    CREATE TRIGGER trigger_name trigger_time trigger_event
        ON tbl_name FOR EACH ROW trigger_stmt
    

    接触程序与命名字为tbl_name的表相关。tbl_name必得援引永远性表。无法将触及程序与临时表表或视图关联起来。

    trigger_time是接触程序的动作时间。它能够是before或after,以指明触发程序是在激活它的话语早前或以往触发。

    trigger_event指明了激活触发程序的言语的门类。trigger_event能够是下述值之生龙活虎:

       insert :将新行插入表时激活触发程序,举个例子,通过insert、load data和replace语句。

      update:改正某大器晚成行时激活触发程序,比方,通过update语句。

         delete :从表中删除某风度翩翩行时激活触发程序,举例,通过delete和replace语句。

    要注意,trigger_event与以表操作方法激活触发程序的SQL语句并不很附近,那点很关键。

    比方说:关于insert的before触发程序不只好被insert语句激活,也能被load data语句激活。

    create trigger triggerName

    after/before insert/update/delete on 表名

    for each row   #那句话在mysql是固定的

    begin

    sql语句;

    end;


     

    对于insert话语, 只有new是合法的;

    对于delete语句,只有old才合法;

    对于update言辞,new、old能够同期利用。


     

    成立表(触发器要操作的两张表)

    /*auto_increment:自增;priamry key :主键;comment:注释*/

    /* drop:删除;if exists xxx(剖断xxx名在数据库时候是还是不是出存在xxx名称卡塔 尔(阿拉伯语:قطر‎*/

    /* for each row :循环大器晚成行生龙活虎行的实践数据 */

    /* after insert/update/delete on table_name :针对哪个表试行的insert/update/delete 操作 */

    drop table if exists table1;
    
    create table table1(
    id int(4) primary key auto_increment not null comment 'id',
    name varchar(225) comment '名字'
    );
    
    drop table if exists table2;
    create table table2(
    id int primary key auto_increment not null comment 'id',
    name varchar(225) comment '名字'
    );
    

    Before与After区别:

    before:(insert、update)能够对new进行校订,after不可能对new实行改过,两者都无法改过old数据。

    insert 触发器

    drop trigger if exists insert_on_table1;
    create trigger insert_on_table1
    after insert  on table1
    for each row
    begin
    insert into table2(name) value(new.name);
    end
    

    操作触发器

    insert table1(name) value('aaa');
    

    查询table2是不是有值

    select * from table2;
    

    delete触发器

    drop trigger if exists delete_on_table1;
    create trigger delete_on_table1
    after delete on table1
    for each ROW
    begin
    delete from table2 where name=old.name;
    end
    

    实行删除操作

    delete from table1 where id=1;
    

    查询table2变化

    select * from table2;
    

    履新table1更新触发器

    drop trigger if exists update_on_table1;
    create trigger update_on_table1
    after update on table1
    for each ROW
    begin
    update table2 set name=new.name where name=old.name;
    end
    

    实施更新操作

    update table1 set name='ccc';
    

    查询table2变化

    select * from table2;
    

     使用before 总计插入积分例子:

    创建表

    drop table if exists table3;
    create table table3(
    id int primary key auto_increment comment 'id',
    num int  comment '积分'
    )engine=myisam  default charset=utf8 comment='单独积分表';
    

    创立用函数变量选择的触发器

    drop trigger if exists insert_on_table3;
    create trigger insert_on_table3
    before insert on table3
    for each row 
    set @sum=@sum new.num;
    

    举办触发器

    set @sum=0;
    insert into table3 values(1,2),(2,3),(3,3),(4,3);
    select @sum;
    

     

    触发器(trigger),mysqltrigger 触发器(trigger):监视某种情状,并触及某种操作。 触发器创制语法四要素:1.监视地方(table)2.监视事件(inse...

    Maven增强

    ts-manage 聚合工程,小组的尖端、中级程序猿他来搭建聚合工程,包括聚合工程下的子项目。

    ts-manage-pojo User.pojo,依样葫芦写其它模块

    ts-manage-mapper

    ts-manage-service

    ts-manage-controller/web

    本身多年来的项目中, 由于数据库设计(别人设计的)原因, 导致某些最简便意义, 查询起来, 都很麻烦和复杂. 牵涉表超级多, 表与表之间又互有部分关系. 笔者想说, 那是自己见过的最不好的数据库设计了. 最终不能, 公司架构师给了触发器的缓慢解决方案.

    Maven增强

    类型间事关:依赖继承聚合

    • 依据于,调用jar时,maven会自动去找那几个jar信赖的相关的别的的jar包。
    • 接轨,jar管理,全数子项目中国共产党有jar包,在这里表明,版本晋级就充足的便利。
    • 集中,在pom.xml中有大器晚成组module,处理多个子项目,意气风发键编写翻译。

    新葡亰496net 1

    总览.png

    测量检验(工作量相当的大卡塔尔和运转(陈设卡塔尔
    前年美利坚合众国大学生DevOpts开拓运转黄金时代体化

    Maven GitHub版本调控 Jenkins
    自动测量试验 JUnit @Test,会自行发出叁个测验报告
    自行运营自动从GitHub下载新的代码,自动的编写翻译,自动打包,自动铺排到tomcat下,自动运转

    ecshop英特网开源商号代码,Mini电商。

    一、触发器

    mysql增强

    在金钱观商家中由DBA数据库管理员,写SQL,查询品质调优。

    但是让大家只是领会?随着硬件和互连网,大数量的上进。比如:nosql 不唯有是sql

    关系型数据库OracleSqlServerMySQL

    软肋,表的多少的关系关系特别的精益求精,多表联合检查,随着数据的拉长,查询越来越慢。

    数据量有自然节制!

    • Oracle单表能够帮助到有个别条数据?上亿
    • MySQL 1000万
    • nosql,最低亿级数据以上mongodb,hbase

    MySQL旧的措施在新的山势下被淘汰:
    1)视图
    2)存款和储蓄进程,函数
    3)触发器
    旧的守旧的合作社,旧的系统还在接纳这么些旧的手艺
    大家面试时,会被问。

    演习上边三个视图:============================================

    CREATE VIEW v_goods238 AS
    SELECT * FROM t_goods WHERE category_id=238
    
    CREATE VIEW v_cat_goods AS 
    SELECT c.name,g.item_type,g.title FROM t_goods_category c
    LEFT JOIN t_goods g
    ON c.id=g.category_id
    

    mysql巩固,大型系统

    1、【撤废】视图,本质便是三个查询语句,功用把复杂SQL封装起来,调用中平素访谈视图名称就能够。那样调用者就拾分有益。很难SQL正是DBA,系统一分配析师。

    2、【裁撤】存款和储蓄进程,本质脚本语言(弱卡塔尔。质量高(在数据库上直接实施,它的服务器品质是装有服务器中最强卡塔尔数据库迁移oracle,mysql

    3、【撤销】函数,本质自定义函数,丰裕专门的职业算法(性格卡塔 尔(阿拉伯语:قطر‎。

    数据库迁移oracle,mysql

    4、【裁撤】触发器,本质相符拦截器。也很笨拙。
    数据库迁移oracle,mysql

    5、索引,复合索引,最左前缀性子本质,便是压实查询作用

    什么样时候创立索引?顾客抱怨时。
    怎么着字段上开创索引?where,order
    主键有索引吗?主键天生就有目录!!!!

    在类型中, 作者新建了一张关系表, 把有些必备的, 有效的关联, 通过触发器的办法, 更新到一张表中, 并在这里张表里面建了索引. 然后读取数据的时候, 就通过连续几日这张关系表, 去获得终极的可行数据. 看上去, 有一点点近似于读写分离的赶脚, 可是那并非多台数据库服务器间的.

    1 数据库编制程序(驾驭)

    数据库中得以编写并保存豆蔻年华段程序,做多少运算

    • 视图 View
    • 积攒进程 Procudure
    • 函数 Function
    • 触发器 Trigger

    mysql 数据库编制程序工夫较弱,非常多效应不也许达成

    是因为职业的涉及, 小编无法使用场目中的数据库来做笔录, 那就融洽搞多少个表来娱乐吧. 先建三张表

    2 变量

    CREATE TABLE `tch_teacher` (
        `Id` INT (11) NOT NULL AUTO_INCREMENT,
        `Sex` SMALLINT (6) DEFAULT NULL,
        `BId` VARCHAR (36) DEFAULT NULL,
        `No` VARCHAR (20) DEFAULT NULL,
        `Name` VARCHAR (30) DEFAULT NULL,
        `IsDeleted` bit (1) DEFAULT b '0' PRIMARY KEY (`Id`),
        KEY `Index_Sex` (`Sex`) USING BTREE,
        KEY `Index_BId` (`BId`) USING BTREE
    ) ENGINE = INNODB AUTO_INCREMENT = 21 DEFAULT CHARSET = latin1;
    
    CREATE TABLE `tch_contact` (
        `Id` INT (11) NOT NULL AUTO_INCREMENT,
        `TId` INT (11) DEFAULT NULL,
        `QQ` VARCHAR (15) DEFAULT NULL,
        `Weixin` VARCHAR (50) DEFAULT NULL,
        `Phone` VARCHAR (15) DEFAULT NULL,
        PRIMARY KEY (`Id`),
        KEY `Index_TId` (`TId`) USING BTREE
    ) ENGINE = INNODB AUTO_INCREMENT = 11 DEFAULT CHARSET = latin1 COMMENT = '联系方式表';
    
    CREATE TABLE tch_all (
        Id INT NOT NULL,
        Sex SMALLINT,
        BId VARCHAR (36),
        NO VARCHAR (20),
        NAME VARCHAR (30),
        QQ VARCHAR (15),
        Weixin VARCHAR (50),
        Phone VARCHAR (15)
    ) COMMENT '完整表';
    

    2.1 客户会话变量

    一个顾客端与服务器连接时期的变量

    set @v1 = 123;
    select @v1;
    

     

    2.2 局地变量

    ​ begin ... end; 是风姿洒脱对大括号,局地变量只好在 begin 到 end 之直接收,end截止后,变量消失

    ​ 使用 declare 关键字来定义局部变量

    ​ delimiter ; 甘休符改成;

    ​ delimiter // 停止符改成//

    ​ 创立复杂的囤积进度此中会用到;甘休符,要是几个;放在一块儿,MySQL只会识别第多少个,现在的不会识别,那样会及其不完全

    begin
       declare v2 int default 123;
       select v2;
       select @v1;
    end//
     (上面无法执行,只是参考)
    

    自家这里就透过触发器的情势, 来保证tch_all那张表. 例子倒霉, 重固然介绍功能, 见谅.

    3. 视图

    delimiter $
    drop trigger if EXISTS tg_insert_all;
    create trigger tg_insert_all after insert on tch_teacher for each ROW
    BEGIN
      insert into tch_all(Sex,BId,NO,NAME) values(new.sex, new.bid, new.no, new.name);
    end $
    delimiter;
    

    3.1 轻巧视图

    ​ 视图的真相便是一个查询语句

    select * from t_goods where category_id=238
    
    create view v_goods238 as 
    select * from t_goods 
    where category_id=238;
    
    select * from v_goods238;
    
    DELIMITER $$  /*设定一个标识符,标识结束$$*/
    
    USE `tedu_store`$$  /*打开指定数据库tedu_store*/
    
    DROP VIEW IF EXISTS `v_goods238`$$  /*如果此视图已经存在,就删除*/
    
    create algorithm = undefined definer = `root`@`localhost` sql security
    definer VIEW `v_goods238` as
    select
      `t_goods`.`id`            AS `id`,
      `t_goods`.`category_id`   AS `category_id`,
      `t_goods`.`item_type`     AS `item_type`,
      `t_goods`.`title`         AS `title`,
      `t_goods`.`sell_point`    AS `sell_point`,
      `t_goods`.`price`         AS `price`,
      `t_goods`.`num`           AS `num`,
      `t_goods`.`barcode`       AS `barcode`,
      `t_goods`.`image`         AS `image`,
      `t_goods`.`status`        AS `status`,
      `t_goods`.`priority`      AS `priority`,
      `t_goods`.`created_time`  AS `created_time`,
      `t_goods`.`modified_time` AS `modified_time`,
      `t_goods`.`created_user`  AS `created_user`,
      `t_goods`.`modified_user` AS `modified_user`
    FROM `t_goods`
    WHERE (`t_goods`.`category_id` = 238)$$
    
    DELIMITER ;
    
    select * from v_goods238;
    
    1. 语法

    3.2 多级关联视图

    create view v_cat_goods as 
    select 
        c.name,
        g.item_type,
        g.title
    from 
        t_goods_category c
    left join 
        t_goods g
    on 
        c.id = g.category_id;
    
    select * from v_cat_goods;
    
    视图在大型项目中被废除!!!!
    视图过程是把查询所有的记录都查询回来,然后再过滤数据,过滤掉非238.
    如果这张表中有一千万数据。数据量大时无法优化。
    Java程序可以吗?mybatis它直接处理,返回结果数据。结果就比视图快。
    

    create trigger 触发器名 before/after insert/update/delete on 表名 for each row

    4. 储存进程

    仓库储存进程是积攒在数据库服务器中的风华正茂段进度代码

    优点:

    Jsp-java-database(proc)

    仓库储存进程离数据库近期,所以它推行代码是功效最高的。

    Client(brower)-WebServer(tomcat)-DatabaseServer(mysql)

    新葡亰496net 2

    WebServer和DatabaseServer,在铺子中,WebServer通平常衣服务器就可以,然则DatabaseServer是有着服务器中最佳的。以至大型项目,小型计算机。Unix Oracle。

    ​ 废除:

    ​ 1卡塔 尔(阿拉伯语:قطر‎写数据库代码(存款和储蓄进程-单独学习语法,不也许断点,system.out未有出口,差不离不只怕调节和测量试验。DBA卡塔尔,写java代码(人士众多,好调节和测量试验卡塔 尔(英语:State of Qatar)。前期维护。不佳维护。Java好保卫安全。

    ​ 2卡塔尔国 存款和储蓄进程倒霉写,品质倒霉调节。

    begin

    4.1 定义存款和储蓄进程

    --  修改结束符
    delimiter //
    
    --  创建存储过程p1
    create procedure p1()
    begin  --  大括号开始
       -- 定义局部变量v2
       declare v2 int default 123;
       select v2; --  显示v2变量的值
    end//  --  大括号结束
    

    end

    4.2 调用存储进度

    call p1()//
    

     

    4.3 查看存款和储蓄进度

    show procedure status where db='db1'
        查看指定库中的存过程
    show create procedure p1
    
    1. 触发时机 before/after

    4.4 删除存储进程

    drop procedure if exists p1//
    

    此地的触发器, 触发的空子是在tch_teacher表数据插入之后. 也便是说, tch_teacher插入成功了以往, 才会向tch_all表插入数据. 这里有一个点须要小心下. 在tch_teacher插入成功后, 向tch_all插入的时候报错, 那么tch_teacher的新插数据就回被回滚.

    4.5 存款和储蓄进度的参数

    三种参数:

    • in 输入参数
    • out 输出参数
    • inout 既可以输入又能出口

    积累进程参数测量试验

    --  向学生表和联系方式表同时插入数据
    --  1) 插入学生数据
    --  2) 得到新插入的自增主键值
    --  3) 插入联系方式表
    传统方式:
    1.  页面填写两张表的数据,学生名称,学生的电话,存在两个表中
    2.  学生表自增主键
    3.  联系表中和学生表的关联(一对一)
    
    CREATE TABLE `t_student` (
      `stu_id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(20) DEFAULT NULL,
      PRIMARY KEY (`stu_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    
    CREATE TABLE `t_tel` (
      `stu_id` int(11) NOT NULL,
      `tel` varchar(30) DEFAULT NULL,
      PRIMARY KEY (`stu_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    
    DELIMITER //
    create procedure p_student_tel
    (in name varchar(20),
    in tel varchar(20), out id int)
    begin
       declare v int;-- 定义临时变量用来存自增主键值
       --  插入学生数据
       insert into t_student(name) values(name);
       --  获得新生成的自增主键值存到v
       set v = last_insert_id();
       --  插入联系方式数据
       insert into t_tel(stu_id,tel) values(v, tel);
       --  自增主键值存到输出参数id
       set id=v;
    end//
    
    -- 调用
    CALL p_student_tel('刘强东',13010100808,@id);
    
    --  调用
    CALL p_student_tel('刘强东',13010100808,@id);
    
    select * from t_student;
    select * from t_tel;
    select @stu_id;
    

    有插入后触发, 自然就有插入前触发, 只须求将after改成before就能够. 

    5 流程调节

    before触发, 则会先想tch_all插入数据, 再向tch_teacher插入数据. 插入进程中, 不管哪一步退步, 都会回滚数据. 所以没有须求操心, 触发不成功的景观下, 会不会导致冗余大概失实数据.

    5.1 if

    if 条件 then
    
       代码
    
    end if
    
    if 条件 then
       代码1
    else
       代码2
    end if
    

     

    5.2 case

    case
       when 条件1 then ...
       when 条件2 then ...
       else ...
    end case
    
    case 变量或表达式
       when 值1 then ...
       when 值2 then ...
       else
    end case
    

    分层剖断测量检验

    delimiter //
    
    drop procedure if exists p1//
    
    create procedure p1(in v int)
    begin
       if v=1 then
          select 'v的值是1';
       end if;
       case v
          when 2 then select 'v的值是2';
          when 3 then select 'v的值是3';
          else select 'v的值不是2,3';
       end case;
    end//
    
    call p1(1) //
    call p1(2) //
    call p1(3) //
    call p1(4) //
    
    1. 接触格局 insert/update/delete

    5.3 while

    while 条件 do
       代码
    end while
    

    接触格局, 有插入/改革/删除 时触发. 例子中笔者只写了插入触发别的三种艺术的利用方法是和那几个近似的.

    5.4 loop

    --  lp: 循环命名,可以起任意的名字
    
    lp: loop
       ...
       if 条件 then
          leave lp; --  指定离开哪个循环
       end if;
       ...
    end loop;
    

     

    5.5 repeat

    repeat
       代码
    until 条件 end repeat;
    

    巡回测验

    --  新建 tb1 表
    use db1 //
    
    drop table if exists tb1 //
    
    create table tb1(
       id int primary key auto_increment,
       num int
    )engine=innodb charset=utf8 //
    
    delimiter //
    drop procedure if exists p2//
    create procedure p2(in n int)
    begin
       declare i int default 0;
       --  while
       while i<n do -- i的值从0递增到n-1
          insert into tb1(num) values(i 1);
          set i=i 1;
       end while; 
       --  loop
       set i=0;
       lp: loop
            insert into tb1(num) values(i 1);
            set i=i 1;
    
            if i=n then -- i等于n时退出loop循环
                leave lp;
            end if;
        end loop;
        -- repeat
        set i=0;
        repeat
          insert into tb1(num) values(i 1);
          set i=i 1;
       until i=n end repeat; -- i等于n时退出repeat循环
    end//
    
    call p2(10) //
    
    select * from tb1 //
    
    1. 原数据援用  old/new

    6. 函数

    • 函数有重临值
    • 调用存款和储蓄进程用call,调用函数直接调

    函数为何不让用?

    分布式?又放在Java端

    Zookeeper集群众管理理者,当大器晚成台服务的配置更新,zk会自动把布署改换新闻更新到别的具有的机器上。

    这里有多个主题素材, 笔者订正了数码, 那么本人怎么引用他们吗? 既然校勘了多少, 那肯定是有 改正前数据和矫正后新数据 的引用的, 

    5.1 创设函数

    create function fn()
    returns varchar(100)
    begin
       执行代码运算产生计算结果
       return 计算结果;
    end//
    

    这里直接使用 old 来指向改革前的多少, new 指向改革后的数据. 这里的照准, 是指向的tch_teacher中的数据, 不是tch_all的数据.

    5.1.1求平方的函数 fn_pow

    DELIMITER //
    drop function if exists fn_pow //
    
    create function fn_pow(n int)
    returns int -- 函数返回什么类型的数据
    begin
    
       set r = n*n;
       return r; -- 向调用位置返回计算结果
    end //
    
    select fn_pow(5) //
    select *, fn_pow(num) from tb1 //
    

     

    6.2 查看函数

    show function status;
    
    show function status where db='tedu_store';
    
    show create function fn_pow;
    

    6.2 删除函数

    drop function if exists fn_pow //
    

    事例中, 小编只用了一句话, 例子嘛, 轻松就好. 其实在实质上采纳进程之中, 不会是那样轻松的. 譬如说吧.

    7 触发器

    对表中的数码操作时,能够触产生龙活虎段代码施行

    四个数据操作:

    • insert
    • update
    • delete

    八个触发时间:

    • before
    • after

    一张表中最多能够有6个触发器

    • before insert
    • after insert
    • before update
    • after update
    • before delete
    • after delete

    八个满含对象

    • new

      ​ 新的数据行
      ​ insert的new:要插入的新行
      ​ update的new:修改后的新行
      ​ delete的new:没有

    • old

      ​ 旧的数据行

      ​ insert的old:没有

      ​ update的old:校勘前的旧数据

      ​ delete的old:被去除的旧数据

    • 做客新行或旧行数据:

    ​ new.id
    ​ new.name
    ​ old.age
    ​ old.tel

    无数时候, 由于数量重要, 不会向来删除数据. 而是接受改革数据状态来表示其已不再选取. 这里就用 isdeleted来代表, 0代表能用, 1代表不再使用.

    7.1 创造触发器

    操作商品表insert,before,new

    create trigger 名 触发时间 on 表
    for each row
    begin
       代码
    end;
    

    用触发器自动更新updated字段

    --  学生表添加 updated字段
    alter table t_student
    add created datetime //
    --  添加触发器,插入数据时自动填入时间
    --  before insert
    DELIMITER //
    CREATE TRIGGER tr_b_i
    BEFORE INSERT ON t_student FOR EACH ROW
    BEGIN
     SET new.created=NOW();
    END //
    
    insert into t_student(name) values('tony') //
    
    select * from t_student //
    
    --  添加触发器,修改数据时自动修改时间
    
    alter table t_student
    add updated datetime //
    
    DELIMITER //
    CREATE TRIGGER tr_b_u
    BEFORE UPDATE ON t_student FOR EACH ROW
    BEGIN
      SET new.updated = NOW();
    END //
    
    UPDATE t_student SET NAME='tina' WHERE stu_id=2
    
    select * from t_student //
    
    
    -- 级联删除。删除主表信息时利用触发器删除子表信息
    
    -- before delete
    
    delimiter //
    create trigger tr_b_d
    before delete on t_student for each row
    begin
        delete from t_tel where stu_id=old.stu_id;
    END //
    
    select * from t_student;
    
    select * from t_tel;
    
    delete from t_student where name='a';
    

    当本人更新tch_teacher的isdeleted的值为1的时候, 触发校订触发器, 在触发器中, 笔者就要求看清 new.isdeleted的值, 进而选取是还是不是删除关系表中的数据.

    7.2 查看触发器

    进去系统库 information_schema

    use information_schema //

    查询 triggers 表中触发器消息

    select * from triggers

    delimiter $
    DROP TRIGGER IF EXISTS tg_update_all ; 
    CREATE TRIGGER tg_update_all AFTER UPDATE ON tch_teacher FOR EACH ROW
    BEGIN
    IF new.isdeleted = 1 THEN
        DELETE FROM tch_all WHERE id = old.id ;
    ELSE
        UPDATE tch_all set sex=new.sex, bid=new.bid, NO=new.NO, NAME=new.NAME where id = old.id;
    END IF ;
    END$
    delimiter ;
    

    7.3 删除触发器

    drop trigger 触发器名

    级联删除

    删去主表的多寡时。要把子表的多寡删除。

    到此地, 笔者意识相同从没持续这几个事例的供给了, 可以吗, 这就这么了.

    8 数据库的备份、复苏

     

    8.1 备份方式:

    1) 冷备份(按月)

    2)热备份

    ​ a. 准时任务 Job (按周,日(早上2点卡塔尔,小时卡塔 尔(英语:State of Qatar)、

    ​ b. 实时备份(主从复制,实时同步卡塔 尔(英语:State of Qatar)

    查看数据安装路线

    select @@basedir AS basePath FROM DUAL;

    C:Program FilesMySQL Server 5.5bin>

    选取 mysqldump 命令备份数据库

    行使 mysql 命令苏醒数据库

    二、视图

    8.2 备份

    退出 mysql,在系统命令行执行:

    上边三令五申是单排代码,不可能折行

    mysqldump -uroot -p
    --default-character-set=utf8    //表中存的是什么编码
    hr>d:hr.sql    //库>文件
    

    数码库名

    视图的功力: 简化查询, 提高查询速度.

    8.3 恢复

    再也苏醒:

    1)在数据库中新建一个库

    ​ create database jtdb2 charset utf8;

    1. 系统命令行奉行恢复生机命令

    ​ 下边发号施令是单排代码,不能折行

    mysql -uroot -p
    --default-character-set=utf8
    jtdb2:jtds.sql
    

    老版本的mysql, 并不协助视图子查询, 不过新本子的mysql, 已经能支撑了.

    9. 索引

    就地点这几个事例来说, 其实也足以选取视图的方法, 去毁灭复杂的逻辑.

    9.1 存储进度爆发大量数额

    1) 创建一个内存表 tm, engine=memory
    2) 创建一个磁盘表 td
    3) 在存储过程中,循环 20000 次向内存表插入随机字符串
    4) 把 20000 条数据,一批存磁盘表
    5)清空内存表
    
    -- 内存表
    
    drop table if exists tm;
    create table tm(
        c varchar(20)
    ) engine=memory chaset=utf8;
    
    -- 磁盘表
    
    drop table if exists td;
    create table td(
        id int primary key auto_increment,
        c varchar(20)
    ) engine=innodb charset=utf8;
    
    -- 存储过程
    
    drop procedure if exists gen_data;
    delimiter //
    create procedure gen_data(in n int)
    begin
        declare i int default 0;
        while i<n do
            insert into tm values (uuid());
            set i=i 1;
        end while;
        insert into td(c) select c from tm;
        delete from tm;
    end //
    
    call gen_data(1000)
    

    新葡亰496net 3

    DROP PROCEDURE IF EXISTS test_insert;
    DELIMITER //
    CREATE PROCEDURE test_insert(cnt INT)
      BEGIN 
        DECLARE i INT DEFAULT 0;
        START TRANSACTION;
        WHILE i<cnt
          DO 
              INSERT INTO td(c) VALUES(UUID());
          SET i=i 1;
          END WHILE;
        COMMIT;
    END //
    
    
    call test_insert(1000);
    

    单是就询问品质上来说, 作者觉着依然触发器的艺术快一些. 究竟触发器维护了一张新表, 何况新表可以建索引来提升查询速度. 便是保卫安全起来比较麻烦.

    9.2 索引优化

    索引其本质是创制了一张索引表,现存表的正片

    (索引须求代价,插入数据要重复排序卡塔尔国

    只拷贝现存表的钦命索引字段。主倘使做了生龙活虎件业务:

    排序

    为何它要排序呢? 为啥排序后就快了呢?

    不成立索引,查询时,全表遍历。

    折半算法

    用索引提升数据检索功能

    -- 没有索引,花3.5秒查询
    select * from td where c='ab' //
    
    -- 对c字段创建索引,花1分40秒左右
    create index td_c_index on td(c) //
    
    -- 有索引查询花费  0.00 秒
    select * from td where c='ab' //
    
    delimiter $
    drop view if EXISTS v_all; -- 删除视图
    create view v_all AS    -- 新建视图
    select tch_teacher.*,tch_contact.QQ,tch_contact.Weixin,tch_contact.Phone from tch_teacher 
    left join tch_contact on tch_teacher.Id=tch_contact.TId where tch_teacher.IsDeleted=0 $
    delimiter;
    

    9.3 MySQL 验证索引的行使-最左前缀性情

    复合索引

    透过 EXPLAIN 关键字能够决断查询 SQL 语句是还是不是选用索引

    EXPLAIN select * from td where c='ab'
    

    新葡亰496net 4

    新葡亰496net 5

    Possible_keys假设有值就代表行使了哪个索引,借使null就意味着询问未有接纳索引,全表遍历。

    SELECT * FROM tb1 
    WHERE user_id=100;
    
    SELECT * FROM tb1 
    WHERE order_id=300;
    
    SELECT * FROM tb1 
    WHERE user_id=100 AND order_id=300;
    
    SELECT * FROM tb1 
    WHERE order_id=300 AND user_id=100 ;
    
    没使用索引
    EXPLAIN 
    SELECT * FROM t_goods 
    WHERE title LIKE '%皮面%'
    
    使用索引
    EXPLAIN
    SELECT * FROM t_goods
    WHERE title LIKE '皮面%'
    
    没有使用索引
    EXPLAIN
    SELECT * FROM t_goods
    WHERE title LIKE '%皮面'
    
    EXPLAIN select * from tb_cart where user_id=1 and item_id=1
    

    新葡亰496net 6

     EXPLAIN select * from tb_cart where user_id=1
    

    新葡亰496net 7

    EXPLAIN SELECT * FROM tb_cart WHERE item_id=1
    

    新葡亰496net 8

    翻看SQL的实行陈设,能够观察第一句、第二句SQL使用了目录,第三句 SQL未利用索引。很好的辨证了目录左边前缀特性新葡亰496netMysql - 触发器/视图。。

    注意:

    1卡塔尔下边包车型客车言辞违反了侧面前缀的特点,为什么照旧能够运用索引呢?因为MYSQL对SQL语句有优化,它会重新整合where条件。

    EXPLAIN SELECT * FROM tb_cart WHERE item_id=1 AND user_id=1
    

    2卡塔 尔(阿拉伯语:قطر‎没有where条件的查询是不会接受索引的。

    这里作者利用到了三个事物:delimiter, 那一个在mysql中, 是用来划分的. 

    10. 作业

    商品表 tb_item

    select * from tb_item;
    

    有何样牌子

    select distinct brand from tb_item;
    

    最贵商品的品牌、名称、价格

    select brand,title,price
    from tb_item
    order by price desc
    limit 1;
    

    分页查看商品

    select id,brand,title,price
    from tb_item
    order by price desc
    -- limit 0,10;
    -- limit 10,10;
    -- limit 20,10;
    limit 30,10;
    

    商品名和商品描述

    select
        title,item_desc
    from 
        tb_item i
    join
        tb_item_desc 
    on 
        i.id = d.item_id
    limit 1;
    

    商品归类表 tb_item_cat

    select * from tb_item_cat;
    
    select * 
    from 
        tb_item_cat
    where 
        name like '%电脑%' 
    or
        name like '%笔记本%'
    or 
        name like '%手机%';
    

    询问全部的顶层分类

    select * from tb_item_cat
    where 
        is_parent=1 
    and 
        parent_id is null;
    

    新葡亰496netMysql - 触发器/视图。查询 161 下的二层分类

    select * from 
        tb_item_cat
    where 
        parent_id=161
    order by sort_order;
    

    查询 162 下的三层分类

    select * from tb_item_cat
    where 
        parent_id=162
    order by 
        sort_order;
    

    用户表

    select * from tb_user;
    

    订单表

    select * from tb_order;
    

    用户 id 是14的订单

    select * from tb_order where user_id=14;
    

    订单号码是 20151001490698615071

    询问这些订单的全体商品

    select * from tb_order_item
    where order_id=20161001490698615071;
    

    订单号码是 二零一六1001490698615071

    ​ 查询各个类型的物品数量

    select cid,count(*) from tb_item group by cid 
    

    查询 类别 163 的商品

    select id,title,price from tb_item where cid=163;
    

    ​ 查询商品价位不超过100的商品名称列表

    select id,title,price from tb_item where price<100;
    

    ​ 查询品牌是联想,且价格在40000之上的商品名称和价格

     select id,title,price from tb_item where brand='联想' and price>40000;
    

    ​ 查询品牌是三木,或价格在10之上的商品名称和价格

     select id,brand,title,price from tb_item where brand='三木' or price<50;
    

    ​ 查询牌子是三木、广博、齐心的商品名称和价格

    select id,brand,title,price from tb_item where brand in('三木','广博','齐心');
    

    ​ 查询牌子不是联想、戴尔的商品名称和价格

    select id,brand,title,price from tb_item where brand not in('联想','戴尔');
    

    ​ 查找品牌是联想且价格高于10000的微计算机名称

    select id,brand,title,price from tb_item where brand='联想' and price>10000;
    

    ​ 查询联想或Dell的微电脑名称列表

    select id,brand,title,price from tb_item where brand='联想' or brand='戴尔';
    

    ​ 查询联想、Dell、三木的商品名称列表

    select id.brand,title,price from tb_item where brand in('联想','戴尔','三木');
    

    ​ 查询不是Dell的微电脑名称列表

    select id,brand,title,price from tb_item where brand not in('戴尔');
    

    ​ 查询全体是记事本的货货色牌、名称和价格

    select id,brand,title,price from tb_item where title like '%记事本%';
    

    ​ 查询品牌是末尾字符是'力'的货物的品牌、名称和价格

    select id,brand,title,price from tb_item where brand like '%力';
    

    ​ 名称中有联想字样的商品名称

    select id,brand,title,price from tb_item where title like '%联想%';
    

    ​ 查询卖点含有'爆款'计算机名称

    select id,brand,title,price from tb_item where cell_point like '%爆款%';
    

    ​ 查询开始字母是A的微型机名称

    select id,brand,price from tb_item where title like 'A%';
    

    ​ 将地点表中的城市、地区、详细地址组合到协同,

    select concat(receiver_city, receiver_district,receiver_address) addr from tb_address;
    

    ​ 获取订单号码为 二零一六1001490698615071中的每一种商品的标题、单价、数量、总价值

    select title,price,num,total_fee from tb_order_item where order_id='20161001490698615071';
    

    ​ 总结商品表中各样品牌的货品数量

    select brand,count(*) from tb_item group by brand
    

    ​ 总结商品表中逐意气风发品牌的物品数量,而且依据数据从少到多排序

    select brand,count(*) c from tb_item group by brand order by c;
    

    ​ 总计商品表中各样品牌的货物数量,去除品牌为NULL的行,並且依照数据从少到多排序

    select brand,count(*) c from tb_item where brand is not null group by brand order by c;
    

    ​ 查询不一致品牌中最贵的物品价位

    select id,title,brand,price from tb_item where(brand,price) in(select brand,max(price) m from tb_item where brand is not null group by brand);
    

    ​ 将不一致品牌中最贵的商品依据标价降序排序

    select id,title,brand,price from tb_item where (brand,price)in(select brand,max(price) m from tb_item where brand is not null group by brand) order by price desc;
    

    ​ 找寻不一样品牌中最贵的商品的前三名

    select id,title,brand,price from tb_item where (brand,price)in(select brand,max(price) m from tb_item where brand is not null group by brand) order by price desc 
    limit 3;
    

    ​ 查询预定了10000028货色的顾客姓名和联系情势(三层子查询)

    ​ 首先查询订单表,依照10000028那个商品编号找到有该商品的订单号码

    ​ 然后查询订单表,依据上边得到的订单号码找到订购此订单的客户号码

    ​ 最终查询客商表,依照第二部中查到的顾客号码,找到相应的顾客名和联系方式

    select id,username,phone,email from tb_user where id in (select user_id from tb_order where (select order_id from td_order_item where item_id=10000028))
    
    select 
        distinct 
    from
        td_user u 
    join 
        tb_order o 
    on 
        u.id=o.user_id
    join 
        tb_order_item i
    on
        o.order_id=i.order_id
    where 
        item_id=10000028
    

    "delimiter $" 到 "$ delimiter;" 之间的东西是独立的. 所以, 假若将触发器的脚本和视图的本子放在五个本子中去推行, 是能够推行的.

    只借使单个实施, 就无需加十二分了. 

     

    本文由新葡亰496net发布于网络数据库,转载请注明出处:新葡亰496netMysql - 触发器/视图

    关键词:

上一篇:没有了

下一篇:没有了