INSERT
поддерживает только одну таблицу за раз, поэтому вам непременно придется выполнить несколько операторов INSERT
, если у вас есть сложные данные, которые входят в несколько таблиц.
Если вы вставили определенное значение $movieid
в movies
, то вы знаете, какое значение нужно вставить в строки других таблиц, чтобы обеспечить ссылочную целостность (псевдокод следует, не полностью функциональный пример):
$movies_sql = 'INSERT INTO movies (movieid, title, year, runtime, plot)
VALUES(?, ?, ?, ?, ?)';
// execute ($movieid, ...)
$actors_sql = 'INSERT INTO movie_actors (movieid, actorid)
VALUES (?, ?)';
foreach ($actorlist as $actorid) {
// execute ($movieid, $actorid)
}
$lang_sql = 'INSERT INTO movie_languages (movieid, language)
VALUES (?, ?)';
foreach ($languagelist as $language) {
// execute ($movieid, $language)
}
Если в вашей таблице movies
используется первичный ключ AUTO_INCREMENT
, то значение, сгенерированное во время первого INSERT
, можно получить, вызвав $ mysqli-> insert_id () или используя встроенная функция LAST_INSERT_ID()
.
$actors_sql = 'INSERT INTO movie_actors (movieid, actorid)
VALUES (LAST_INSERT_ID(), ?)';
foreach ($actorlist as $actorid) {
// execute ($actorid) -- only one param in this INSERT
}
Обратите внимание, что LAST_INSERT_ID()
сообщает самое последнее автоматически сгенерированное значение во время текущего сеанса, поэтому, если вы вставите в другую таблицу, которая использует автоматический первичный ключ, значение изменится. Но сообщаемое значение стабильно во время ваших сеансов; не изменяется, если другой сеанс клиента выполняет вставки одновременно.