我需要在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 ;
我的目标是让存储过程自动在所有三个表中插入数据。我想将以下内容传递给存储过程:
收到输入后,存储过程需要:
如果标签表中不存在特定的tag_name,则应将其添加到新行中。
我几乎没有使用MySQL编程的经验,并且非常感谢您对我上面概述的方法的指导/批评。
您认为有更好/更简单的方法吗?如果是,那是什么?请提供一个简单的代码示例。
谢谢!