MySql多个插入有多个父和子

时间:2017-08-09 02:56:26

标签: mysql

如何在mysql中插入多个具有多个子节点的父节点?

示例:

parent - child/children
jane - jane1,jane2
denise - denise1,denise2,denise3
lovely - lovely1

- 父母插入

insert into tbl_parent(id,name)
    values('1', 'jane'), ('2', 'denise'), ('3', 'lovely')

-child insert

1 个答案:

答案 0 :(得分:0)

即使你的问题不完整而猜测就像是在看水晶球,我也做了一些假设:

  • 我已将您的示例放在表tbl_input
  • 我创建了一个表tbl_person来覆盖id,name和parent_id,以实现从子节点到父节点的1:n关系,所以父节点的子节点在一个表中!

tbl_person,tbl_input和一些示例数据的表定义:

CREATE TABLE `tbl_person` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) unsigned DEFAULT NULL,
  `name` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `fk_parent_person` (`parent_id`),
  CONSTRAINT `fk_parent_person` FOREIGN KEY (`parent_id`) 
    REFERENCES `tbl_person` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE TABLE tbl_input(parent VARCHAR(20),childs VARCHAR(200));

INSERT INTO tbl_input(parent,childs) VALUES
('parent','child,children'),
('jane','jane1,jane2'),
('denise','denise1,denise2,denise3'),
('lovely','lovely1');

函数str_split的定义和过程Input2person: (我改编自this answer

DELIMITER $$

CREATE FUNCTION strSplit(x VARCHAR(20000), delim VARCHAR(12), pos INTEGER) 
RETURNS VARCHAR(20000)
BEGIN
  DECLARE output VARCHAR(20000);
  SET output = REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos)
                 , LENGTH(SUBSTRING_INDEX(x, delim, pos - 1)) + 1)
                 , delim
                 , '');
  IF output = '' THEN SET output = null; END IF;
  RETURN output;
END $$


CREATE PROCEDURE Input2person()
BEGIN
  DECLARE i INTEGER;

  INSERT INTO tbl_person (name) SELECT parent FROM tbl_input;

  SET i = 1;
  REPEAT
    INSERT INTO tbl_person (name,parent_id)
      SELECT strSplit(c.childs, ',', i), p.id
      FROM tbl_input c JOIN tbl_person p ON c.parent = p.name
      WHERE strSplit(c.childs, ',', i) IS NOT NULL;
    SET i = i + 1;
    UNTIL ROW_COUNT() = 0
  END REPEAT;
END $$

DELIMITER ;

现在您必须CALL Input2Person();SELECT * FROM tbl_person;才能获得结果。希望有所帮助。