MySql, разбить строку и вставить в таблицу - PullRequest
8 голосов
/ 21 октября 2011

У меня есть два входа для моей хранимой процедуры. Один из них - «RoledID», а второй - «MenuID». «MenusID» - это список разделенных запятыми идентификаторов меню, которые необходимо вставить с помощью RoledID. RoleId - это просто INT, и нам нужно поместить этот RoledID против каждого MenuID. Моя таблица 'RolesMenus' содержит два столбца: один для MenuID и один для RoleID.

Теперь мне нужно разделить MenuID и вставить каждый MenuID с RoleID.

Как мне написать хранимую процедуру для нее?

Ответы [ 3 ]

13 голосов
/ 21 октября 2011

Вы можете создать один запрос 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;

Как видите, это можно сделать без хранимой процедуры.

4 голосов
/ 21 октября 2011

Дайте это. Может потребоваться некоторая настройка, если строка MenuIDs не соответствует 'menuId, menuId, menuId'.

Также я не знаю, к какому типу данных относится столбец menuId в вашей целевой таблице (INT?), Поэтому вам, возможно, придется также ввести некоторую числовую проверку (в случае '1,2,3, банан, 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 ;
0 голосов
/ 21 октября 2011

AFAIK MySQL не имеет функцию для разделения строк. Вот руководство MySQL для функций, связанных со строками. В разделе комментариев должна быть некоторая информация об обходных путях для расщепления строки с помощью функции substring, но она не очень полезна: Руководство по MySQL

...