数据库高级操作

视图

视图就是一个虚拟的表

create view 视图名 select * from 数据库;

触发器

使用触发器可以定制用户对表进行增、删、改操作的前后行为。

  1. 创建触发器
# 插入前
create trigger tri_before_insert_tb1 before insert on tb1 for each row
BEGIN
    ...
END

# 插入后
create trigger tri_after_insert_tb1 after insert on tb1 for each row
BEGIN
    ...
END

# 删除前
create trigger tri_before_delete_tb1 before delete on tb1 for each row
BEGIN
    ...
END

# 删除后
create trigger tri_after_delete_tb1 after delete on tb1 for each row
BEGIN
    ...
END

# 更新前
create trigger tri_before_update_tb1 before update on tb1 for each row
BEGIN
    ...
END

# 更新后
create trigger tri_after_update_tb1 after update on tb1 for each row
BEGIN
    ...
END

# 删除触发器
如: drop trigger tri_after_insert_cmd;

示例

create table cmd(
    id int primary key auto_increment,
    user varchar(32),
    priv varchar(10),
    cmd varchar(64),
    sub_time datetime,  # 提交时间
    success enum('yes', 'no')  # 0代表执行失败
);

create table errlog(
    id int primary key auto_increment,
    err_cmd char(64),
    err_time datetime
);

# 创建触发器
delimiter //
create trigger tri_after_insert_cmd after insert on cmd for each row
BEGIN
    if NEW.success = 'no' THEN
        insert into errlog(err_cmd, err_time) values(NEW.cmd, NEW.sub_time);
    END IF;
END//
delimiter ;

# 往cmd表中插入记录,触发触发器,根据IF的结果决定是否插入错误日志
insert into cmd(user, priv, cmd, sub_time, success) values('nihao', '1111', 'ls -alh', NOW(), 'yes');

# 查询错误日志
select * from errlog;

存储过程

存储过程包含了一系列可执行的sql语句,存储过程存放在MySQL中,通过调用它的名字可以执行其内部的sql。

  • 优点
    • 用于替代程序员写的sql语句,实现程序与sql解耦。
    • 基于网络传输,传别名的数据量小,而直接传sql数据量大。
  • 缺点
    • 程序员想要扩展功能不便利

创建无参的存储过程

delimiter //
create procedure 存储过程名()
BEGIN
    select * from class;
END //
delimiter ;

# 查看创建的存储过程
show create procedure 存储过程名;

# 存储过程的调用
## mysql中
call 存储过程名();

## Pythonz中
cursor.callproc('存储过程名')

创建无参的存储过程

delimiter //
create procedure 存储过程名(in n1 int, in n2 int, out ret int)
BEGIN
    select * from teacher where tid > n1 and tid < n2;
    set ret=1;
END //
delimiter ;

# 存储过程的调用
## mysql中
set @x;
call 存储过程名(1, 3, @x);
select @x;

## Python中
cursor.callproc('存储过程名', (1, 3, 0))
cursor.execute('select @_存储过程名_2;')
cursor.fetchone()

事务

事务用于将某些操作的多条SQL作为原子性操作,一旦有某个出现错误,即可回滚到原来的状态,从而保证数据库中数据的完整性。

create table user(
    id int primary key auto_increment,
    name varchar(32),
    balance int
);

insert into user(name, balance) values('xxx', 1000), ('yyy', 1000);

# 开启事务
start transaction;
update user set balance=900 where name='xxx';
update user set balance=800 where name='xxx';
commit;

# 出现异常就回滚到初始状态
start transaction;
update user set balance=900 where name='xxx';
update user set balance=800 where name='xxx';
rollback;
commit;

函数

内置函数请百度。

自定义函数

delimiter //
create function f1(
    i1 int, 
    i2 int)
returns int
BEGIN
    declare num int;
    set num = i1 + i2;
    return(num);
END //
delimiter ;
delimiter //
create function f(
    i int
)
returns int
begin
    declare ret int default 0;
    if i = 10 then
        set ret = 100;
    elseif i=20 then
        set ret = 200;
    elseif i=30 then
        set ret = 300;
    else
        set ret = 400;
    end if;
    return ret;
end //
delimiter ;

删除函数

drop function func_name;

执行函数

# 获取返回值
select upper('xxx') into @res;
select @res;

# 查询中使用
select f1(i1, nid), name from tb2;

猜你喜欢

转载自www.cnblogs.com/tmdhhl/p/11094733.html
今日推荐