Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在重复密钥更新时插入或更新查找集中的所有值以及更新未查找集中的所有值_Mysql_Insert_Locking_On Duplicate Key - Fatal编程技术网

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

以下是我想做的:

名为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中,在@emp_id文本中)

插入TBL_部门员工(部门ID,员工ID,处于活动状态) 选择@dep\u id,员工id,1 来自TBL_员工 在集合中查找(员工ID,@emp\u ID) 在重复密钥更新时,激活=1

更新TBL_部门员工 集合处于活动状态=0 其中DEPARTMENT_ID=@dep_ID,在_集中找不到(EMPLOYEE_ID,@emp_ID)

只有第一个查询运行,我猜第二个查询无法运行,因为锁定或其他原因, 我尝试了事务提交技巧,但没有成功。 我想也许这里有一个很棒的家伙可以帮上忙,或者eben可以在一个查询中运行它。
谢谢

这个过程并不漂亮,但在给定连接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 ;

谢谢这对我也有用。哦,我只能投一次票:-(