zoukankan      html  css  js  c++  java
  • 事务、视图、触发器、存储过程、函数、数据库的备份

    1.事务
    通俗的说,事务指一组操作,要么都执行成功,要么都执行失败

    思考:
    我去银行给朋友汇款,
    我卡上有1000元,
    朋友卡上1000元,
    我给朋友转账100元(无手续费),
    如果,我的钱刚扣,而朋友的钱又没加时,
    网线断了,怎么办?

    演示:
    create table user (
    id int auto_increment primary key,
    name varchar(32) not null default '',
    salary int not null default 0
    )charset utf8;

    insert into user (name, salary) values ('zekai', 1000);
    insert into user (name, salary) values ('min', 1000);

    解决的方法:
    使用事务:
    #操作完一起提交:
    start transaction;
    sql语句
    commit;

    #操作完撤回事务所有sql语句操作:
        start transaction;
    sql语句
    rollback;





    例子:
    commit成功:
    mysql> start transaction;
    Query OK, 0 rows affected (0.00 sec)

    mysql> update user set salary=900 where name='zekai';
    Query OK, 1 row affected (0.01 sec)
    Rows matched: 1 Changed: 1 Warnings: 0

    mysql> select * from user;
    +----+-------+--------+
    | id | name | salary |
    +----+-------+--------+
    | 1 | zekai | 900 |
    | 2 | min | 1000 |
    +----+-------+--------+
    2 rows in set (0.00 sec)

    mysql> update user set salary=1100 where name='min';
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1 Changed: 1 Warnings: 0

    mysql> select * from user;
    +----+-------+--------+
    | id | name | salary |
    +----+-------+--------+
    | 1 | zekai | 900 |
    | 2 | min | 1100 |
    +----+-------+--------+
    2 rows in set (0.00 sec)

    mysql> #2.提交
    mysql> commit;
    Query OK, 0 rows affected (0.06 sec)

    rollback回滚:
    mysql> start transaction;
    Query OK, 0 rows affected (0.00 sec)

    mysql>
    mysql>
    mysql> update user set salary=800 where name='zekai';
    Query OK, 1 row affected (0.01 sec)
    Rows matched: 1 Changed: 1 Warnings: 0

    mysql> select * from user;
    +----+-------+--------+
    | id | name | salary |
    +----+-------+--------+
    | 1 | zekai | 800 |
    | 2 | min | 1100 |
    +----+-------+--------+
    2 rows in set (0.00 sec)

    mysql> rollback;
    Query OK, 0 rows affected (0.11 sec)

    mysql> select * from user;
    +----+-------+--------+
    | id | name | salary |
    +----+-------+--------+
    | 1 | zekai | 900 |
    | 2 | min | 1100 |
    +----+-------+--------+
    2 rows in set (0.00 sec)

    rollback回滚,影响所有:

    mysql> start transaction;
    Query OK, 0 rows affected (0.00 sec)

    mysql> update user set salary=800 where name='zekai';
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1 Changed: 1 Warnings: 0

    mysql> update user set salary=700 where name='zekai';
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1 Changed: 1 Warnings: 0

    mysql> select * from user;
    +----+-------+--------+
    | id | name | salary |
    +----+-------+--------+
    | 1 | zekai | 700 |
    | 2 | min | 1100 |
    +----+-------+--------+
    2 rows in set (0.00 sec)

    mysql> rollback;
    Query OK, 0 rows affected (0.05 sec)

    mysql> select * from user;
    +----+-------+--------+
    | id | name | salary |
    +----+-------+--------+
    | 1 | zekai | 900 |
    | 2 | min | 1100 |
    +----+-------+--------+
    2 rows in set (0.00 sec)

    特性:(****************)
    原子性(Atomicity),事务是最小的执行单位,即不能再分的事务,要么全部执行,要么全部取消(就像上面的银行例子)
    一致性(Consistency):指事务发生前和发生后,数据保持一致,多个事务对同一个数据读取的结果是相同的
    隔离性(Isolation):简单点说,某个事务的操作对其他事务不可见的
    持久性(Durability):当事务完成后,其影响应该保留下来,不能撤消,只能通过“补偿性事务”来抵消之前的错误

    存储引擎:(**************)

    InnoDB : 保时捷引擎

    MyIsam : 奔奔引擎

    建表的时候,
    create table user (
    id int auto_increment primary key,
    name varchar(32) not null default '',
    salary int not null default 0
    )engine=Innodb charset utf8;

    mysql5.5以上, 默认用到就是InnoDB

    两个引擎的区别:(**************)
    1. Innodb支持事务,MyISAM不支持
    2. InnoDB支持行锁,MyISAM支持的表锁




    2.视图

    项目, 有100个SQl, 其中80个SQL都是:select * from user where name='xxx';


    增加视图:
    create view 视图名 as SQL语句;

    删除:
    drop view v1;

    例子:
    mysql> select * from user where name='zekai';
    +----+-------+--------+
    | id | name | salary |
    +----+-------+--------+
    | 1 | zekai | 900 |
    +----+-------+--------+
    1 row in set (0.00 sec)


    mysql> create view v1 as select * from user where name='zekai';
    Query OK, 0 rows affected (0.07 sec)

    mysql>
    mysql> show tables;
    +-----------------+
    | Tables_in_test3 |
    +-----------------+
    | user |
    | v1 |
    +-----------------+
    2 rows in set (0.00 sec)

    mysql> select * from v1;
    +----+-------+--------+
    | id | name | salary |
    +----+-------+--------+
    | 1 | zekai | 900 |
    +----+-------+--------+
    1 row in set (0.00 sec)



    3.触发器

    两张表:
    订单表 库存表

    场景:
    当我下一个订单的时候, 订单表中需要增加一个记录, 同时库存表中需要减1
    这两个操作是同时发生的, 并且前一个操作出发后一个操作

    使用方法:
          增加:
    delimiter //

    create trigger tri_befor_intsert _tb1 before insert on tb1 for each row
       begin
         insert into tb2 (name) values('aa') #插入的sql语句
       end //

    delimiter ;


    ### 当向tb1表中添加一条数据的同时, 向tb2表添加一条数据

    查看:
    show triggersG
    *************************** 1. row ***************************
    Trigger: tri_before_insert_tb1
    Event: INSERT
    Table: t2
    Statement: BEGIN
    INSERT INTO t3 (NAME) VALUES ('aa');
    END
    Timing: BEFORE
    Created: 2019-11-01 11:47:20.65
    sql_mode: ONLY_FULL_GROUP_BY
    Definer: root@localhost
    character_set_client: gbk
    collation_connection: gbk_chinese_ci
    Database Collation: latin1_swedish_ci

    删除:drop trigger 触发器名;

    例子:
    mysql> select * from t2;
    Empty set (0.00 sec)

    mysql> select * from t3;
    Empty set (0.00 sec)
    mysql> insert into t2 (name) values ('zekai');
    Query OK, 1 row affected (0.06 sec)

    mysql> select * from t2;
    +----+-------+
    | id | name |
    +----+-------+
    | 1 | zekai |
    +----+-------+
    1 row in set (0.00 sec)

    mysql> select * from t3;
    +----+------+
    | id | name |
    +----+------+
    | 1 | aa |
    +----+------+
    1 row in set (0.00 sec)


    4.存储过程

    像 一个 SQL函数

    创建:

    delimiter //

    create procedure p1()
    begin
    select * from user where id=2;
    end //

    delimiter ;

    例子:

    mysql> delimiter //

    mysql> create procedure p1()
    -> BEGIN
    -> select * from user where id=2;
    -> END //
    Query OK, 0 rows affected (0.10 sec)

    mysql> delimiter ;

    mysql> call p1();
    +----+------+--------+
    | id | name | salary |
    +----+------+--------+
    | 2 | min | 1100 |
    +----+------+--------+
    1 row in set (0.00 sec)

    Query OK, 0 rows affected (0.01 sec)

    删除:
    drop procedure p1;



    5.函数 select 函数名(参数)
    char_length(str)
    返回值为字符串str 的长度,长度的单位为字符。一个多字节字符算作一个单字符。
    对于一个包含五个二字节字符集, LENGTH()返回值为 10, 而CHAR_LENGTH()的返回值为5。

    concat(str1,str2,...)
    字符串拼接
    如有任何一个参数为NULL ,则返回值为 NULL。

    format(X,D)
    将数字X 的格式写为'#,###,###.##',以四舍五入的方式保留小数点后 D 位, 并将结果以字符串的形式返回。若 D 为 0, 则返回结果不带有小数点,或不含小数部分。
    例如:
    SELECT FORMAT(12332.1,4); 结果为: '12,332.1000'

    instr('helloworld','h')
      结果为 1

    返回字符串 str 中子字符串的第一个出现位置。

    left('helloworld',3)
      结果为‘hel’

    返回字符串str 从开始的len位置的子序列字符。

    lower(str)
    变小写

    upper(str)
    变大写

    ltrim(str)
    返回字符串 str ,其左边引导空格字符被删除。

    rtrim(str)
    返回字符串 str ,其结尾空格字符被删去。

    substring(str,pos,len)
    获取字符串子序列
    locate(substr,str,pos)
    获取子序列索引位置

    repeat(str,count)
    返回一个由重复的字符串str 组成的字符串,字符串str重复的的数目等于count 。
    若 count <= 0,则返回一个空字符串。
    若str 或 count 为 NULL,则返回 NULL 。

    replace(str,from_str,to_str)
    返回字符串str 以及所有被字符串to_str替代的字符串from_str 。

    reverse(str)
    返回字符串 str ,顺序和字符顺序相反。

    right(str,len)
    从字符串str 开始,返回从后边开始len个字符组成的子序列


    http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chapter/functions.html#encryption-functions




    6.运维方向:
    数据库的备份 cmd下执行语句

    为啥要备份?
    将重要的数据保存下来

    用法:
    #语法:
    # mysqldump -h 服务器 -u用户名 -p密码 数据库名 表名, 表名,.... > aaa.sql

    #示例:
    #单库备份
    mysqldump -uroot -p123 db1 > D:db1.sql #备份整个db1库
    mysqldump -uroot -p123 db1 table1 table2 >D: db1-table1-table2.sql # 备份db1库里面的表

    #多库备份
    mysqldump -uroot -p123 --databases db1 db2 mysql db3 > db1_db2_mysql_db3.sql

    #备份所有库
    mysqldump -uroot -p123 --all-databases > all.sql

    重新导入:
      create database test3;
      use test 3;

    mysql> source D:/test3.sql;
  • 相关阅读:
    [算法学习] 单调栈
    UVA11275 3D Triangles(三维几何)
    2019CCSU11月校赛 B,G题解
    2017-2018 ACM-ICPC Northern Eurasia (Northeastern European Regional) Contest (NEERC 17)(B,D)
    2016湖南省省赛 B 有向无环图(树形dp)
    2016湖南省省赛 J 三角形和矩形(计算几何)
    JAVA 高精度小数模板
    2019湖南省赛 K 双向链表练习题(list)
    2019 字节跳动 [编程题]最大映射(贪心)
    HDU 6740 MUV LUV EXTRA(kmp原理)
  • 原文地址:https://www.cnblogs.com/fjn839199790/p/11777267.html
Copyright © 2011-2022 走看看