MySql,拆分一个字符串并插入表中

Tau*_*han 8 mysql mysqli stored-procedures

我的存储过程有两个输入.一个是'RoledID',第二个是'MenuID'.'MenusIDs'是需要使用RoledID插入的逗号分隔菜单ID列表.RoleId只是一个INT,我们需要将这个RoledID放在每个MenuID上.我的表'RolesMenus'包含两列,一列用于MenuID,另一列用于RoleID.

现在我需要拆分MenuID并使用RoleID插入每个MenuID.

我该如何为它编写存储过程?

Dev*_*art 13

您可以构建一个INSERT查询(因为语句允许插入多个记录)并使用预准备语句运行它,例如 -

SET @MenuIDs = '1,2,3';
SET @RoledID = 100;

SET @values = REPLACE(@MenuIDs, ',', CONCAT(', ', @RoledID, '),('));
SET @values = CONCAT('(', @values, ', ', @RoledID, ')'); -- This produces a string like this -> (1, 100),(2, 100),(3, 100)

SET @insert = CONCAT('INSERT INTO RolesMenus VALUES', @values); -- Build INSERT statement like this -> INSERT INTO RolesMenus VALUES(1, 100),(2, 100),(3, 100)

-- Execute INSERT statement
PREPARE stmt FROM @insert;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Run Code Online (Sandbox Code Playgroud)

如您所见,它可以在没有存储过程的情况下完成.


Tom*_*Mac 5

试试这个。如果 MenuIDs 字符串不符合“menuId,menuId,menuId”,则可能需要进行一些调整。

此外,我不知道您的目标表(INT?)中的 menuId 列是什么数据类型,因此您可能还必须进行一些数字检查(以防传入 '1,2,3,banana,4,5'作为 MenuIds 输入参数)。

DELIMITER $$

DROP PROCEDURE IF EXISTS `insert_role_menuids`$$

CREATE PROCEDURE `insert_role_menuids`(IN RoleID INT,IN MenuIDs varchar(500))
BEGIN
declare idx,prev_idx int;
declare v_id varchar(10);

set idx := locate(',',MenuIDs,1);
set prev_idx := 1;

WHILE idx > 0 DO
 set v_id := substr(MenuIDs,prev_idx,idx-prev_idx);
 insert into RolesMenus (RoleId,MenuId) values (RoleID,v_id);
 set prev_idx := idx+1;
 set idx := locate(',',MenuIDs,prev_idx);
END WHILE;

set v_id := substr(MenuIDs,prev_idx);
insert into RolesMenus (RoleId,MenuId) values (RoleID,v_id);

END$$
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)