1、 游标 cursor使用存储过程对sql进行编程的时候,当查询的结果集是多个的时候,可以 利用查询语句生成一个游标,对查询结果就行迭代。
BEGIN
DECLARE _done INT DEFAULT false;
DECLARE _name VARCHAR(50);
-- 定义游标,并将sql结果集赋值到游标中
DECLARE my_cursor CURSOR FOR (SELECT userName from sys_user_menu WHERE menuId=22);
-- 声明当游标遍历完后将标志变量置成某个值
DECLARE CONTINUE HANDLER FOR NOT found SET _done=true;
-- 打开游标
OPEN my_cursor;
-- 声明开始循环
my_loop:LOOP
-- 将游标中的值赋值给变量
FETCH my_cursor INTO _name;
-- 判断是否结束循环,一定要放到FETCH之后,如果放到fetch之前,
-- 先判断done,这个时候done的值还是之前的循环的值,因此就会导致循环一次
IF _done THEN LEAVE my_loop;
END IF;
-- SELECT _doctor;
DELETE FROM sys_user_menu WHERE userName=_name AND menuId IN(26,27);
INSERT INTO sys_user_menu (userName,menuId) VALUES (_name,26),(_name,27);
-- 结束循环
END LOOP my_loop;
-- 关闭游标
CLOSE my_cursor;
END
2、 在使用存储过程进行批量写数据时,要注意查询字段的类型。因为mysql的查询为弱类型的,即menuId为varchar类型,但是通过int型仍可以查询,有符符合条件的可以查询出结果但是,update、insert、deleet语句为强类型,即所使用的条件必须是一一对应的才可以执行,所以menuId=‘22’才可以执行
3、mysql检测是否有表锁
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
然后找到进程号,即 trx_mysql_thread_id,状态是lock wait的
释放表锁
kill [trx_mysql_thread_id];