MySQL:在多对多数据模型中插入数据的存储过程

时间:2016-09-26 23:04:12

标签: mysql database stored-procedures

我需要在MySQL中存储具有多对多关系的数据(条目和标签)。如果重要,我正在使用MySQL 5.7的服务器。

考虑到多对多关系,我创建了三个表:entries,tags,entries_tags。

条目(条目)表:

CREATE TABLE `entries` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `date` datetime DEFAULT NULL,
  `data1` double DEFAULT NULL,
  `data2` varchar(150) DEFAULT NULL,
  `data3` varchar(150) DEFAULT NULL,
  `data4` varchar(150) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

标签(标签)表:

CREATE TABLE `tags` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `tag_name` varchar(150) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

用于存储地图条目的表 - tags(entries_tags):

CREATE TABLE `entries_tags` (
  `eID` int(11) NOT NULL,
  `tID` int(11) NOT NULL,
  PRIMARY KEY (`eID`,`tID`),
  KEY `fk_tags_idx` (`tID`),
  CONSTRAINT `fk_entries` FOREIGN KEY (`eID`) REFERENCES `entries` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_tags` FOREIGN KEY (`tID`) REFERENCES `tags` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

我还创建了一个简单的存储过程来在条目表中插入一个条目:

DELIMITER $$
CREATE DEFINER=user@localhost PROCEDURE insert_entry(
        IN  _date          DATE, 
        IN  _data1        DOUBLE, 
        IN  _data2        VARCHAR(150),
        IN  _data3        VARCHAR(150), 
        IN  _data4        VARCHAR(150)
     )
BEGIN 
    INSERT INTO entries
         (
           date,
           data1,
           data2,
           data3,
           data4,
         )
    VALUES 
         ( 
           _date,
           _data1,
           _data2,
           _data3,
           _data4,
         );
END$$
DELIMITER ;

我的目标是让存储过程自动在所有三个表中插入数据。我想将以下内容传递给存储过程:

  • date [datetime]
  • data1 [double]
  • data2 [varchar(150)]
  • data3 [varchar(150)]
  • data4 [varchar(150)]
  • tag_names [n个字符串的数组]

收到输入后,存储过程需要:

  • 使用insert_entry
  • 在条目表中插入新行
  • 使用SELECT LAST_INSERT_ID()
  • 获取新创建的条目ID eID
  • 迭代tag_names并从标签表中获取相应的tID
  • 在entries_tags
  • 中插入n行(eID,tID)

如果标签表中不存在特定的tag_name,则应将其添加到新行中。

我几乎没有使用MySQL编程的经验,并且非常感谢您对我上面概述的方法的指导/批评。

您认为有更好/更简单的方法吗?如果是,那是什么?请提供一个简单的代码示例。

谢谢!

0 个答案:

没有答案