2014-12-25 5 views
1

Мой вопрос немного длинный, я сожалею об этом.Как вставить значения в таблицу соединений?

Я добавляю значения в свои две таблицы, используя приведенный ниже код, но у меня также есть таблица соединений book_cover, и я хочу добавить данные в эту таблицу, чтобы установить связь между book_id и metadata_image_id (так как книга имеет более одного обложки), как я могу это сделать, когда я добавляю записи в первый раз?

Я не мог подключиться, хотя я читал о соединениях.

Я использую MySQL и InnoDB.

Вот мой PHP код для добавления данных:

$stmt = $sqli->prepare("INSERT INTO book(book_original_name, book_publication_date, book_synopsis) VALUES (?,?,?,?)"); 
$stmt->bind_param("sss", $_POST['book_original_name'], $_POST['book_year'], $_POST['book_synopsis']); 
$stmt->execute(); 
$stmt->close(); 

$stmt = $sqli->prepare("INSERT INTO metadata_images(metadata_image_value, type, size) VALUES (?,?,?)"); 
$stmt->bind_param("sss", $name, $_FILES['book_cover']['type'], $_FILES['book_cover']['size']); 
$stmt->execute(); 
$stmt->close(); 

Например, когда я добавил книгу, которая имеет идентификатор 50 и metadata_image имеет идентификатор 92, я также хочу добавить book_id и metadata_image_id к моей таблице соединений, чтобы создать связь между конкретной книгой и изображением. Какой SQL-запрос я должен использовать для достижения этого?

Моя структура базы данных:

Table : book 
book_id (PK and AI) 
book_original_name 
book_publication_date 
book_synopsis 

Table : metadata_images 
metadata_image_id (PK and AI) 
metadata_image_value 
type 
size 

Junction Table : book_cover 
book_id (Foreign key from book) 
book_metadata_id (Foreign key from metadata_images) 
+0

Другое 'INSERT'? –

+0

Я вижу, но как я могу позволить моему вставить запрос узнать, какой идентификатор был добавлен в другие таблицы перед ним? – salep

+1

Только ** вы ** знаете реальность своих данных. Точно так же, как вы знали, что положить в первые две таблицы **, вы ** должны знать, что нужно вставить в третью. Пока вы не заселяете все три таблицы, нет ** ссылки **. –

ответ

2

Если вы знаете, что вы только что вставили книгу с ID 50 и изображение с ID 92, и они непосредственно связаны между собой (то есть, что книга имеет этот образ на обложке), то запрос для заполнения таблицы перехода просто:

INSERT INTO book_cover VALUES (50, 92); 

Там не секрет, или специальный запрос для таблиц сопряжения. Трюк эффективно определяет, какие значения вставлять; для этого используйте функцию MySQL LAST_INSERT_ID(), с которой вы можете получить доступ через API mysqli как mysqli::$insert_id.

Вы должны получить идентификатор сразу после оператора INSERT, который сгенерировал его, в том же сеансе. Вы можете сохранить его в пользовательской переменной, выполнить следующую вставку, а затем использовать идентификатор вставки из второй таблицы вместе с идентификатором, сохраненным из первой таблицы, в качестве параметров для вашей вставки в таблицу соединений.

Это хорошая идея обернуть все это в транзакцию, чтобы вы не вставляли только часть информации о книге; либо все три запроса (или сколько угодно) должны преуспеть, либо все должно завершиться неудачей.