Я думаю, тебе придется это разбить. Один из способов сделать это - добавить ограничение UNIQUE
к tag
и выполнить следующие действия:
INSERT IGNORE INTO tags (tag) VALUE ('new_tag')
, а затем
INSERT INTO tag2post (postid, tagid)
VALUES
(
332, # the post
(SELECT tagid FROM tags WHERE tag = 'new_tag')
)
Однако
INSERT IGNORE
может плохо масштабироваться. Таким образом, альтернативой является выполнение SELECT
, если идентификатор отсутствует, INSERT
, тогда обязательно поймайте исключение здесь, если другой поток / процесс / служба изменил таблицу между вашим SELECT
и сейчас. В INSERT
вы делаете LAST_INSERT_ID()
, и он ловит вас, повторяя начальный SELECT
..
Не круто, но если требуется параллелизм, вам нужно это сделать. Транзакции не устранят проблему, и если у вас нет ограничения UNIQUE
на tag
, вы можете получить дубликат INSERT
s.