Упрощенная версия:
У меня есть таблица с именем books (book_id, book_title), где book_id - это первичный ключ и серийный номер (поэтому он автоматически назначается без ввода его).
У меня также есть другая таблица с именем book_version (id, book_id, book_version), где book_id является внешним ключом для первой таблицы.
В форме я беру название и версию книги. Я вставляю заголовок в первую таблицу и должен вставлять сгенерированную book_id вместе с версией во вторую таблицу.
Как я могу это сделать без трех отдельных запросов (одна вставка для первой таблицы, одна выбирает, чтобы получить идентификатор и одну вставку для второй таблицы)?
Идея здесь состоит в том, что одна и та же книга может быть опубликована несколько раз с небольшими изменениями, поэтому я хочу отслеживать разные версии.
Используйте триггер после вставки в первой таблице:
http://dev.mysql.com/doc/refman/5.7/en/trigger-syntax.html
Триггер после вставки может ссылаться на вставленную строку, а затем вам нужно запустить только 1 оператор, чтобы вставить версию.
Вам нужно только вставить первую строку через PHP, и ваш триггер установлен в базе данных и выполняет работу после этого.
Это лучший способ сделать это, ИМО.
Хотя здесь были некоторые довольно хорошие идеи (т.е. Триггеры, хранимые процедуры или получение последней вставленной строки), использование функциональных возможностей Returning казалось лучшим решением, по крайней мере, в моем случае.
mysql_insert_id() is mysql function which gets last inserted id into database.
<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
mysql_select_db('mydb');
here book_id is autofill
mysql_query("INSERT INTO books ('book_title') values ('kossu')");
$ last_insert_id = mysql_insert_id();
Теперь для второго идентификатора таблицы является автозаполнение
mysql_query("INSERT INTO book_version ('book_id', 'book_version') values ($last_insert_id,'6.48' )");
?>
Я бы использовал хранимую процедуру и делегировал ей работу. Запросов еще будет 3, но эти 3 запроса будут выполнены в MySQL. Ваш PHP-код будет рассматривать только как 1 запрос,