0

私のテーブルは次のようになります。

テーブル「投稿」

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 を返します。イッピー:)

4

1 に答える 1