Advanced Operations database

view

View is a virtual table

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

trigger

Triggers can be customized using user table add, delete, change before and after the conduct of operations.

  1. Creating Triggers
# 插入前
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;

Examples

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;

Stored Procedures

Stored procedure contains a series of executable sql statements, stored procedures stored in MySQL, you can do it inside sql by calling its name.

  • advantage
    • Used to replace programmers to write sql statement, sql implement procedures and decoupling.
    • Network-based transmission, data transmission amount is small alias, sql direct transfer large volumes of data.
  • Shortcoming
    • Programmers want to extend the functionality is not convenient

Create a stored procedure with no parameters

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

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

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

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

Create a stored procedure with no parameters

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()

Affairs

A plurality of transaction for some SQL operations as an atomic operation, once an error occurs, can be rolled back to the original state, thereby ensuring the integrity of data in the database.

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;

function

Please Baidu built-in functions.

Custom Functions

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 ;

Delete function

drop function func_name;

Perform functions

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

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

Guess you like

Origin www.cnblogs.com/tmdhhl/p/11094733.html