mysql部分总结

// 监视地点table
// 监视事件 insert/update/delete
// after/before
// 触发事件 insert/update/delete

create trigger t1
after insert
on ord
for each row
begin 
update goods  XXX;
end;

create goods(
gid int ,
name varchar(20),
num smallint);

create table ord(
ord int,
gid int,
much smallint);

insert into goods values
(1,'cat',34),
(2,,'dog',50),
(3,'pig',21);


// 引用参数触发器
create TRIGGER t2 
after insert 
on ord
for each ROW
begin 
update goods set num=num-new.much WHERE new.gid=gid;
END;

// ---------------------------------------
CREATE TRIGGER t4 
BEFORE 
update 
on ord
for each row 
begin 
update goods set num = num+old.much -new.much where gid = old .gid;
end;





// ----------------------------------------
;Updating of NEW row is not allowed in after trigger
// 在new行插入之前就要改
// insert :new 
// 原因:insert 之后,new行已经插入到表中,成为事实,改new已经晚了
create TRIGGER t5
BEFORE
insert 
on ord 

for each row 
begin 

DECLARE 
rnum int ;

select num into rnum from goods where gid=new.gid;
if(new.much > rnum) 
then set new.much=rnum;
end if;
update goods set num=num-new.much where gid=new.gid;
end;

// 过程:封装若干条语句,调用时这些封装体执行
// 函数:是有返回值的过程 过程没有返回值
// 若干条sql语句封装起来----过程    把此过程存储在数据库中--存储过程

create procedure procedureName()
begin

end;

// declare 变量名 变量类型 default 默认值

create p2()
begin 
declare age int  default 18;
declare height int default 180;

select concat('年龄是',age,'身高是',height);

end;

-- create PROCEDURE p3()
-- begin 
-- declare age int  default 18;
-- declare height int default 180;
-- set age:=age+20;
-- select concat('年龄是',age,'身高是',height);
-- end;

create procedure p4()
begin 

 declare height int default 180;
 set age:=age+20;
 select concat('年龄是',age,'身高是',height);

end;

// 存储过程传参

create procedure p5(width int,height int)
begin 

	if width>height then 
		select '你挺胖';
	elseif width < height
		select '你挺瘦';
	else 
		select '你挺方';

	end if;

end;

create procedure p6()
begin 

	declare total int default 0;
	declare num int default 0;

	while num < 100 do
		set total:=total+num;
		set num:=num+1;
	end while;

	select total;
	
end;

// 游标
create procedure p()
begin 

	declare row_gid int;
	declare row_num int;
	declare row_name varchar(20);

declare getgoods cursor for 
select gid,num,name from goods;

open getgoods;

fetch getgoods into row_gid,row_num,row_name;
select row_gid,row_name;

fetch getgoods into row_gid,row_num,row_name;
select row_gid,row_name;

fetch getgoods into row_gid,row_num,row_name;
select row_gid,row_name;

close getgoods;

end;


// 循环游标
create procedure p14()
begin 

	declare row_gid int;
	declare row_num int;
	declare row_name varchar(20);

	declare cnt int default 0;
	declare i int default 0;
	declare getgoods cursor for select gid,num,name from goods ;

	open getgoods;

	repeat 
	set i=i+1;
	fetch getgoods into ...;
	until i>=cnt end repeat;

end;

//mysql结束标志
create procedure p14()
begin 

	declare row_gid int;
	declare row_num int;
	declare row_name varchar(20);

	declare cnt int default 0;
	declare i int default 0;
	declare have int default 1;
	declare exit handler for NOT FOUND set have = 0;
	// declare continue handler for NOT FOUND set have = 0;
	//判断标志  最后一次执行repeat  fetch->无数据->触发not found ->set have=0 
	// ->continue->继续执行(后面sql语句)->select  row_num,row_gid,row_name->最后一行被取出两次
	//用 declare exit handler for NOT FOUND set have = 0;替换
	
	// continue 是触发后,后面语句继续执行
	// exit是触发后,后面语句不再执行
	// undo是触发后,后面语句不再执行 目前mysql不支持

	declare getgoods cursor for select gid,num,name from goods ;

	open getgoods;

	repeat 
	
	fetch getgoods into row_gid,row_num,row_name;

	until have=0 end repeat;//最后一条记录会出现两次

end;

// 游标循环读取正确逻辑
create procedure p16()
begin 
	declare row_gid int;
	declare row_num int;
	declare row_name varchar(20);
	declare cnt int default 0;
	declare i int default 0;
	declare have int default 1;
	
	declare getgoods cursor for select gid,num,name from goods ;
	declare exit handler for NOT FOUND set have = 0;

	open getgoods;
	fetch getgoods into row_gid,row_num,row_name;

	repeat 
	select row_gid,row_num,row_name;
	fetch getgoods into row_gid,row_num,row_name;
	until have=0 end repeat;

end;

//用户连接到mysql 并做各种查询

[用户]<!----->[服务器]
分为两个阶段:

1、你有无权连接上来
2、你有无权执行此操作(select、update等)

对于1 :服务器如何判断:
3个参数:
1、从哪儿来host 
2、你是谁 user 
3、密码多少 pwd 
用户3个信息存储在mysql下的user表下
// 修改host域 使IP能连接
update user set host='192.168.1.101' where user = 'root';
flush privileges;// 刷新权限 flush privileges;
// 修改用户密码
update user set password=password('111111') where xxxx;
flush privileges;

// 新增一个用户
grant [权限1,权限2] on *.* to user@'host' identified by 'password';
常用权限 all,create,drop,insert,delete,update,select; 
grant all on *.* to lisi@'192.168.1.%' identified by '111111'; //%通配

// 收回权限
revoke all on *.* form lisi@'192.168.1.%';

//针对某个库授权
grant all on test2.*  to lisi@'192.168.1.%' ;
revoke all on test2.* from ...;
// 针对某个表授权
grant  create,update,insert,select on test2.goods to lisi@...;

总结:
1、user表 看看让不让连
2、db级
3、tables_priv级

// 主从复制原理
1、主服务器配置binlog
2、从服务器配置relaylog
3、从服务器如何有权读取master的binlog?(binlog比较敏感)
授权 master要授予slave账号
4、从服务器用账号连接master


原文地址:https://www.cnblogs.com/fighterhit/p/6387932.html