• 20150106--SQL事务操作+触发器二


    修改变量

    语法1:修改变量(会话级别:当前连接修改有效)

    set 变量名 = 值;

    wps90D0.tmp

    语法2:修改全局变量(变量本身是全局变量,针对所有用户所有连接都有效)

    set GLOBAL 变量名 = 值;

    set @@global.变量名 = 值;

    wps90E1.tmp

    wps90E2.tmp

    语法3:修改全局变量

    找到mysql的配置文件,在配置项里面修改。(不建议)

    自定义变量

    定义

    语法1:定义变量并赋值

    set @变量名 = 值;

    wps90F3.tmp

    语法2:直接从记录中将数据存放到变量

    select 字段列表 from 表名 where条件 into 变量列表(@变量名);

    wps90F4.tmp

    select @变量 := 字段,… from 表名 where条件;

    在SQL中,=有其特殊的函数:比较运算符,也可以用于变量赋值,SQL为了区分赋值符号和比较符号,特意新增了一个赋值符号:   :=

    wps9104.tmp

    使用自定义变量

    与系统变量一致

    select @变量名;

    wps9105.tmp

    修改变量

    所有的变量,要进行修改必须使用关键字set

    set @变量名 = 值;

    wps9106.tmp

    删除变量

    系统没有提供删除变量的方式,要删除变量,其实就是将变量置空

    set @变量 = null;

    wps9117.tmp

    用户自定义的变量全部都是会话级别的,当前连接有效,断开就无效了。

    用户自定义的变量是属于会话级别,但是是全系统有效(跨库)

    wps9118.tmp

    变量作用域

    变量作用的范围,在SQL中,变量的作用域分为两种:全局作用域和局部作用域,与js一样,全局变量可以在任何地方使用,而局部变量只能在函数内部使用。

    凡是使用@符号定义的变量,都是全局变量(函数内部也可以定义全局变量)

    局部变量语法:没有@符号,也不用set声明

    declare 变量名 数据类型 default 默认值;

    需求:

    有两张表:订单表和商品表

    每增加一张订单,对应的商品库存数量要减少。

    触发器

    触发器:一个代码的容器,将一堆要执行的代码捆绑到一起,在某一件事情发生的时候,自动的触发这段代码。

    触发器语法

    创建触发器的语法

    临时语句结束符:delimiter

    delimiter $$ -- 从当前开始,后面的所有代码,直到碰到$$才认为一条语句结束

    create trigger 触发器名字 触发时间 事件类型 on 表名 for each row

    begin

    捆绑的代码

    代码是以行为单位,每行都必须有语句结束符:”;”

    end

    $$

    delimiter   ; -- 将语句结束符改回来

    触发时间:分为两种,数据操作前和操作后

    before:数据真正写入到表之前

    after:数据已经写入到表之后

    事件类型:所有的触发器都是针对数据写操作(增删改)

    insert:新增

    update:修改

    delete:删除

    触发时间和事件类型共同组成了触发器的类型:触发器类型一共6种。一张表最多可以有6个触发器。同一种触发器一张表只能有一个。

    wps9128.tmp

    查看触发器

    查看所有的触发器

    show triggersG

    wps9129.tmp

    触发器使用

    触发器的使用不是用户手动调用,而是在操作数据的时候如果满足某一个特定的条件,就会自动触发。

    wps913A.tmp

    删除触发器

    语法

    drop trigger 触发器名字;

    wps913B.tmp

    触发器获取外部数据

    在触发器的内部,内置了两个对象:old和new,两个对象代表了触发前和触发后的数据记录。可以使用这两个对象来访问对应的数据。

    语法:

    old.字段名/new.字段名

    只有更新语句可以使用old和new,但是删除的触发器只有old,新增的触发器只有new

    wps913C.tmp

    效果

    wps914D.tmp

    触发器应用

    触发器主要用户数据的连表操作(对多条记录进行写的连带操作)

    触发器虽好,但是会导致数据库数据维护变得不可控,那么从php的角度出发,程序很少使用触发器。

    作业

    1. 一张表最多有几个触发器?6个

    2. 当一张表6个触发器都存在的时候,以下情况会触发哪些触发器

    a) insert on duplicate key,主键重复

    b) replace into,主键重复

    索引

    1. 什么是索引?

    索引就是类似书的目录,提高检索数据的效率。

    索引是系统按照某个具体的算法(哈希,散列,二叉树),将数据从全部数据里进行提取,维护成一个索引文件,然后系统在进行数据查询的时候,发现如果查询条件刚好满足索引条件,就可以从索引文件中快速的定位的数据所在位置。

    mysql中有哪些索引?

    主键索引(primary key效率最高的索引)

    唯一索引(unique key):不为空的情况下效率最高

    普通索引(index)对数据没有要求,文件很大,效率比较低

    全文索引(fulltext),对整个文章内部进行关键字索引(mysql5.5以后InnoDB支持全文索引)

    英文的全文索引很简单:英文单词默认是用空格分离的

    中文的全文索引很难:中文的词组成很麻烦,需要利用分词工具(sphinx)

    用户管理

    root是超级管理员用户,拥有最大权限,可以进行任何操作。

    1. 创建用户

    create user 用户信息 identified by 密码; -- 创建用户使用密码

    用户信息:用户名@主机名,主机名是允许访问的主机地址,local@192.168.114.%,允许局域网内部用户访问

    密码:系统里面默认使用sha1加密方式加密,但是该处使用明文密码,系统自动加密

    wps915D.tmp

    所有的用户都在mysql数据库下的user表中存在

    wps916E.tmp

    2. 授权:给用户指定数据库的操作权限

    grant 权限列表 on 库名.表名 to 用户;

    权限列表:select,update,delete….

    用户:用户名@主机地址

    wps916F.tmp

    效果

    wps9170.tmp

    权限列表

    wps9180.tmp

    一次性赋予全部权限

    grant all privileges on 库.* to user;

    wps9181.tmp

    3. 回收权限

    revoke 权限列表 on 库.表 from user;

    wps9182.tmp

    回收权限之后需要用户下次登录的时候才会生效。

    4. 删除用户

    drop user 用户;

    wps9193.tmp

    如果有时候会因为权限的阻塞,缓存没有刷新,需要刷新权限缓存。

    flush privileges;

    wps9194.tmp

    root密码忘了?怎么办?

    重装数据库

    root密码找回

    1. 关闭服务器

    wps91A5.tmp

    2. 无权限重启:重新启动服务使用以下命令

    mysqld.exe –skip-grant-tables

    wps91A6.tmp

    3. 无用户直接进入数据库

    mysql直接访问

    wps91B6.tmp

    4. 进入到mysql数据库内的user表中修改root用户的密码

    修改密码的时候,必须使用password函数进行加密

    update user set password = password(‘root’) where user=’root’ and host =‘localhost’;

    wps91B7.tmp

    5. 重启服务器

    wps91C8.tmp

    6. 使用新的密码进行登录

    wps91C9.tmp

    注意:在进行无权限登录的时候,所有人都可以无条件进入数据库,而且拥有全部权限。所以在进行root密码找回的时候,必须特别谨慎。(可以利用操作系统的安全性),应该在最没有用户访问的情况下,进行修改,将损失减小到最低。

  • 相关阅读:
    启用了不安全的HTTP方法
    Ubuntu 16.04出现:Problem executing scripts APT::Update::Post-Invoke-Success 'if /usr/bin/test -w /var/cache/app-info -a -e /usr/bin/appstreamcli; then appstreamcli refresh > /dev/null; fi'
    python发邮件
    糗事百科爬虫
    链接爬虫
    简单图片爬虫
    常见的非贪婪匹配
    [Selenium] WebDriver 操作 HTML5 中的 drag/drop
    [Selenium] 操作 HTML5 中的 Canvas 绘制图形
    [Selenium] WebDriver 操作 HTML5 中的 video
  • 原文地址:https://www.cnblogs.com/lifushan/p/6493250.html
Copyright © 2020-2023  润新知