Вставка данных в две или более таблицы: - PullRequest
0 голосов
/ 22 марта 2011

У меня есть следующие таблицы:

thread: id, title, content, created
thread_tags: tag_id, thread_id
tag: id, name
author_threads: thread_id, author_id

Чтобы создать поток, все эти поля должны быть заполнены (идентификаторы, очевидно, автоматически увеличиваются).Я знаю, что могу использовать SQL TRANSACTIONS, чтобы убедиться, что все они заполнены или отсутствуют, но как мне заполнить tag_id, thread_id, author_id и thread_id (в author_threads) из последнего оператора sql?Без транзакции я бы использовал mysqli_last_insert_id.

Также я должен использовать mysqli::multi_query?Как мне убедиться, что все эти поля заполнены?

О, и я использую PHP с MYSQL.

РЕДАКТИРОВАТЬ:

Будет ли это работать?

   $sql_thread = "START TRANSACTION;
                  INSERT INTO thread (title, content)
                  VALUES ('some title', 'some content')";

   #  this is normally a loop, as there are more than one tags:   
   $sql_tags = "INSERT INTO tag (name) 
               VALUES ('onetag')";


   #  normally I would check the return value
   mysqli_query($link, $sql_thread);

   #  get the thread id:
   $thread_id = mysqli_insert_id($link);

   mysqli_query($link, $sql_tags);

   #  get the tag id:
   $tag_id = mysqli_insert_id($link);

   #  insert into thread_tags:
   mysqli_query($link, "INSERT INTO thread_tags (thread_id, tag_id)  VALUES ($thread_id, $tag_id)");

   #  insert into author_threads, I already know author_id:
   mysqli_query($link, "INSERT INTO author_threads (author_id, thread_id)  VALUES ($author_id, $thread_id)
                        COMMIT;");

1 Ответ

1 голос
/ 22 марта 2011

Мне кажется, вы уже знаете ответ: используйте mysqli_insert_id() или SELECT LAST_INSERT_ID(). У вас не должно возникнуть проблем при использовании их с транзакциями:

  • начать транзакцию
  • вставить строку
  • получить идентификатор последней вставки
  • вставить строку, используя id для внешней ссылки
  • ...
  • совершить транзакцию

Если что-то не получится, откатите транзакцию, и у вас ничего не будет.

...