Mysql 如何在重复密钥更新时插入或更新查找集中的所有值以及更新未查找集中的所有值
以下是我想做的: 名为departments的表与名为employees的表有多对多关系。 所以,表department\u employees有几个列:department\u id、employeer\u id、is\u active 索引部门id,员工id作为主键 我得到一系列员工ID,如“12,15,18,19”。 我有部门id 我调用一个Mysql存储过程(例程),它应该:Mysql 如何在重复密钥更新时插入或更新查找集中的所有值以及更新未查找集中的所有值,mysql,insert,locking,on-duplicate-key,Mysql,Insert,Locking,On Duplicate Key,以下是我想做的: 名为departments的表与名为employees的表有多对多关系。 所以,表department\u employees有几个列:department\u id、employeer\u id、is\u active 索引部门id,员工id作为主键 我得到一系列员工ID,如“12,15,18,19”。 我有部门id 我调用一个Mysql存储过程(例程),它应该: 将所有员工插入该部门 如果它们存在且未激活,则激活 所有其他员工都应停用 创建过程(在@dep_id INT
- 将所有员工插入该部门
- 如果它们存在且未激活,则激活
- 所有其他员工都应停用
谢谢 这个过程并不漂亮,但在给定连接ID的情况下,这是我能想到的最好的方法。它还应该比FIND_IN_SET解决方案工作得更快,因为它可以使用EMPLOYEE_ID上的索引
CREATE PROCEDURE `test`(IN `dep_id` INT, IN `emp_ids` TEXT)
LANGUAGE SQL
NOT DETERMINISTIC
MODIFIES SQL DATA
SQL SECURITY DEFINER
COMMENT ''
BEGIN
START TRANSACTION;
IF(emp_ids REGEXP '^[0-9,]+$') THEN #this will NOT guarantee a valid query but will prevent injections
UPDATE TBL_DEPARTMENT_EMPLOYEES SET IS_ACTIVE=0 WHERE DEPARTMENT_ID=dep_id;
SET @q = CONCAT('
INSERT INTO TBL_DEPARTMENT_EMPLOYEES (DEPARTMENT_ID, EMPLOYEE_ID, IS_ACTIVE)
SELECT ?, EMPLOYEE_ID, 1
FROM TBL_EMPLOYEES
WHERE EMPLOYEE_ID IN (',emp_ids,')
ON DUPLICATE KEY UPDATE IS_ACTIVE=1;
');
PREPARE stmt1 FROM @q;
SET @dep_id = dep_id;
EXECUTE stmt1 USING @dep_id;
DEALLOCATE PREPARE stmt1;
END IF;
COMMIT;
END ;
谢谢这对我也有用。哦,我只能投一次票:-(