mysql 基础技术

时间:2023-03-09 15:45:52
mysql 基础技术

一、树状结构

参考http://www.cnblogs.com/kingteach/archive/2011/07/05/2098046.html

create procedure Pro_GetUnderOrg(in userid varchar(50))
begin
declare lev int;
set lev=1;
drop table if exists tmp1;
CREATE TABLE tmp1(`ID` BIGINT,LoginID VARCHAR(50),Username varchar(50),pre_LoginID varchar(50) ,levv INT);
INSERT tmp1 SELECT `ID`, LoginID,Username,pre_LoginID,1 FROM tbUsers WHERE pre_LoginID=userid;
while row_count()>0
do
set lev=lev+1;
INSERT tmp1 SELECT t.`ID`, t.LoginID,t.Username,t.pre_LoginID,lev from tbUsers t join tmp1 a on t.pre_LoginID=a.LoginID AND levv=lev-1;
end while ;
INSERT tmp1 SELECT `ID`,LoginID,Username,pre_LoginID,0 FROM tbUsers WHERE LoginID=userid;
SELECT * FROM tmp1 where LoginID <>userid;/*这一步是为了去除自己*/
end;

二、存储过程异常处理

create PROCEDURE Pro_JH(in curr VARCHAR(50),in target VARCHAR(50),in pre VARCHAR(50))
BEGIN
DECLARE Li CHAR(18);
DECLARE t_error INTEGER DEFAULT 0; /*注意:申明字段 必须在前面 否则会报错*/
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;
SET Li='';
START TRANSACTION;
select License INTO Li from tbLicense where UserID=curr and hasUsed=0 and Actual is NOT NULL and IsDele=0 LIMIT 1;
IF Li='' THEN
ROLLBACK;
SELECT '该用户没有可用激活码!';
ELSE
update tbLicense set hasUsed=1 where License= Li and UserID=curr;
update tbUserMeny set Total=Total-1,Available=Available-1 where userid=curr and type=2;
INSERT into tbLicenseWallet_Log (userid,ChangeAmount,License,Remark,Price) VALUES ( curr,1,Li,CONCAT('为',target,'激活账户'),(select `Value` from tbdictionary where `Key`='jhmdj'));
UPDATE tbusers set License=Li,`Status`=1,`Role`=(select ID from tbrole where rolecode='VIP') where LoginID = target and pre_LoginID =pre;
IF t_error = 1 THEN
ROLLBACK;
SELECT '错误';
ELSE
COMMIT;
SELECT '';
END IF;
END IF;
END;

三、一次更新多条数据记录

UPDATE tabl1
SET filter1 = CASE id
WHEN 1 THEN 3
WHEN 2 THEN 4
WHEN 3 THEN 5
END
WHERE id IN (1,2,3)

四、临时表的使用

/*获取上级所有的节点 一条语句中只能试用一次临时表*/
create PROCEDURE Pro_GetParents(in sid INT)
BEGIN
declare lev INT;
DECLARE userid VARCHAR(50);/*pre*/
select(select pre_LoginID from tbusers u where u.LoginID = temp.userid and IsDele=0) INTO userid from tbgethelp temp where temp.id=(SELECT temp.getid from tbhelp_successlist temp where id=sid);
set lev=1;
CREATE TEMPORARY TABLE if not exists tmp2(`ID` BIGINT,`Status` TINYINT(1),LoginID VARCHAR(50),Username varchar(50),pre_LoginID varchar(50),Mobile CHAR(15),CreateTime timestamp,levv INT)
ENGINE = memory;
truncate TABLE tmp2;
CREATE TEMPORARY TABLE if not exists tmp1(`ID` BIGINT,`Status` TINYINT(1),LoginID VARCHAR(50),Username varchar(50),pre_LoginID varchar(50),Mobile CHAR(15),CreateTime timestamp,levv INT)
ENGINE = memory;
truncate TABLE tmp1; INSERT tmp2 SELECT `ID`,`Status`,LoginID,Username,pre_LoginID,Mobile,CreateTime,lev FROM tbUsers WHERE LoginID=userid and IsDele =0;
INSERT tmp1 select * from tmp2;
while row_count()>0 and EXISTS(SELECT * from tmp1)
do
set lev=lev+1;
INSERT tmp2 SELECT t.`ID`,t.`Status`, t.LoginID,t.Username,t.pre_LoginID,t.Mobile,t.CreateTime,lev from tbUsers t join tmp1 a on t.LoginID = a.pre_LoginID where a.LoginID<>a.pre_LoginID and t.IsDele = 0 AND a.levv=(lev-1);
if row_count()>0 THEN
TRUNCATE TABLE tmp1;
INSERT tmp1 select * from tmp2 WHERE levv=lev;
END IF;
end while;
SELECT `ID`,`Status`,CASE `Status` when 0 then '未激活' else '已激活' end as StatusName,Username,LoginID,pre_LoginID,Mobile,date_format(CreateTime,'%Y-%c-%d %h:%i:%s')CreateTime,levv FROM tmp2 ORDER BY CreateTime DESC;
DROP TEMPORARY TABLE IF EXISTS tmp2;
DROP TEMPORARY TABLE IF EXISTS tmp1;
end

五、编码问题

--查询编码
show variables like 'char%'
--修改编码
character_set_server='utf8';

六、创建用户并授权

GRANT ALL PRIVILEGES ON 数据库.* TO 用户名@"%" IDENTIFIED BY "密码";