2013-11-26 63 views
1

我有多个user_roles。每个user_role都有多个权限,每个权限都有多个值。我需要创建一个包含user_role_name,description,priviliges_fk(array),values(arrayofstring)作为输入的过程。 这是我写的程序。从mysql中的数组插入值

DELIMITER $$ 
DROP PROCEDURE IF EXISTS `save_role`$$ 
CREATE DEFINER=`event_admin`@`%` PROCEDURE `save_role`(IN p_role_name INT, 
          IN p_description INT, 
          IN p_privilege_fk INT(), 
          IN p_values VARCHAR(1000) 
         ) 
BEGIN 
     DECLARE i int default 0; 
     DECLARE V_ROLE_FK int; 
     DECLARE counter INT DEFAULT 0; 

     INSERT INTO ROLE (ROLE_NAME,DESCRIPTION) VALUES(p_role_name,p_description); 
     SELECT ROLE_PK INTO V_ROLE_FK FROM ROLE WHERE ROLE_NAME=p_role_name AND DESCRIPTION=p_description; 

simple_loop:LOOP 
SET counter = counter + 1; 
    INSERT INTO ROLE_PRIVILEGE_BRIDGE (ROLE_FK,PRIVILEGE_FK,VALUE) VALUES(V_ROLE_FK,p_privilege_fk(i),p_values); 
END LOOP simple_loop; 
END; 

回答

2

你不能。有两种解决方法,将工作

  1. 呼叫每个单元的过程一次阵列
  2. 串联的数组元素为一个字符串的东西(即|分隔;,:),然后在内部分割该字符串在程序中。

我会去第一个选择。它更干净,更容易理解并且更容易测试。

1

我建议你使用主键AUTO_INCREMENT选项,它将有助于与他们合作。然后使用自动递增的主键值将新行插入到子表中 - 一个接一个地将数组作为字符串参数使用。

例如(数据简化):

CREATE TABLE ROLE(
    ID INT(11) NOT NULL AUTO_INCREMENT, 
    ROLE_NAME INT, 
    DESCRIPTION INT, 
    PRIMARY KEY (ID) 
) 
ENGINE = INNODB; 

CREATE TABLE ROLE_PRIVILEGE_BRIDGE(
    ID INT(11) NOT NULL AUTO_INCREMENT, 
    PRIVILEGE_FK INT(11) DEFAULT NULL, 
    VALUE INT(11) DEFAULT NULL, 
    PRIMARY KEY (ID), 
    CONSTRAINT FK FOREIGN KEY (PRIVILEGE_FK) REFERENCES ROLE (ID) 
) 
ENGINE = INNODB; 


INSERT INTO ROLE(ROLE_NAME, DESCRIPTION) VALUES(1, 1); 
SET @new_id = LAST_INSERT_ID(); 

INSERT INTO ROLE_PRIVILEGE_BRIDGE(PRIVILEGE_FK, VALUE) VALUES (@new_id, 1); 
INSERT INTO ROLE_PRIVILEGE_BRIDGE(PRIVILEGE_FK, VALUE) VALUES (@new_id, 2); 
INSERT INTO ROLE_PRIVILEGE_BRIDGE(PRIVILEGE_FK, VALUE) VALUES (@new_id, 3); 
+0

谢谢您的建议 –