私のテーブルは次のようになります。
テーブル「投稿」
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 を返します。イッピー:)