我的表如下所示:
表“帖子”
posts.id = PK, auto-increment
posts.text = varchar
posts.tag_id 1 = int, FK to tags.id
posts.tag_id 2 = int, FK to tags.id
posts.tag_id 3 = int, FK to tags.id
表“标签”
tags.id = PK, auto-increment
tags.tag = varchar
现在我想插入以下数据:
text: 'lorem ipsum'
tag1: 'music'
tag2: 'pop'
tag3: 'singer'
所以我需要一个查询来检查 tag1/tag2/tag3 是否已经存在于“标签”中,否则插入它们,然后将它们作为外键 +“文本”插入到“帖子”中的新行中。
我查看了 mysql INSERT IF NOT EXISTS 但我只是卡住了,不知道从哪里开始。我知道我可以通过多个查询来处理它,但必须有另一种更轻松的方法来获得相同的结果。
有没有人有这方面的经验?
更新
我的一个朋友提出了这样的建议:
CREATE FUNCTION getTagID(tag VARCHAR('100')) RETURNS int
INSERT INTO posts (text,tag1,tag2,tag3)
VALUES ('lorem ipsum', getTagID('music'), getTagID('pop'), getTagID('singer'));
当然 getTagId 的实现仍然缺失,但这有意义吗?getTagID 应该选择具有给定标签的 id,如果它不存在,则插入它并返回它。任何帮助表示赞赏。
解决方案
我在 MySql 中创建了一个自定义函数:
DELIMITER ;;
CREATE FUNCTION getTagID(tag VARCHAR(100)) RETURNS BIGINT
BEGIN
DECLARE tagID BIGINT;
SET tagID = (SELECT id FROM tags WHERE text = tag);
IF tagID IS NULL
THEN
INSERT INTO tags (text) VALUES (tag);
SET tagID = (SELECT LAST_INSERT_ID());
END IF;
RETURN tagID;
END;;
DELIMITER ;
现在我可以插入这样的帖子:
INSERT INTO posts (text,tag1,tag2,tag3)
VALUES ('lorem ipsum', getTagID('music'), getTagID('pop'), getTagID('singer'));
使用该函数,该函数仅在标签尚不存在时插入“标签”并返回现有或新创建标签的 ID。伊皮:)