2013-11-26 62 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

謝謝您的建議 –