Mysql 函数存储过程
1. 定义函数/存储过程时,有多行,需要这样:
DELIMITER ;;
CREATE FUNCTION getManager(v_emp_id bigint)
...
;;
DELIMITER用户定义命令结束符,这里定义为双分号。也就是遇到双分号,就可以执行命令了。否则mysql认为单行就能执行,会编译不通过。
2. 在函数/存储过程中的sql执行和外面不一样
可能原因是, 传入参数与表中的字段冲突了:
CREATE FUNCTION getManager(emp_id bigint)
...
SET s_mgr_id = CAST(v_emp_id AS CHAR);
...
SELECT manager_id INTO s_mgr_id FROM emp_assignment WHERE emp_id = s_mgr_id;
传入参数和where 字段(表中字段)重名了,导致where子句始终成立。
3. GROUP_CONCAT(ID)
将多行的id拼接成一行,以逗号分隔
4. FIND_IN_SET(SRC, TARGET)
在TARGET中匹配SRC,找到返回位置,找不到返回0
可用于where clause中,用于返回所有target中的元素,实现递归功能
5. 存储过程
DELIMITER ;;
CREATE PROCEDURE in_param(IN p_in int)
BEGIN
DECLARE s_num int(10) default 1;
DECLARE s_name varchar(50);
while s_num < p_in do
set s_name = concat('test',s_num);
insert into employee(id,name,email) values(nextval('emp_s'),1,1,s_name,s_name);
set s_num = s_num+1;
end while;
END;
;;
DELIMITER ;
#调用
CALL in_param(2000);
6. 批量更新
update table a join(select id,name from employee) b on a.created_by = b.id set a.name = b.name;
7. mysql workbench备份
mysql -u root -p <schema> > 文件名.sql