Как через объединения нескольких таблиц cделать INSERT INTO?

Рейтинг: 0Ответов: 1Опубликовано: 18.05.2011

Доброе время суток!

Столкнулся с проблемой, не знаю, как решить, делая книжный каталог, я делал в БД столбцы жанры и авторы отдельно, объединяя их одним вызовом:

SELECT books.title, books.min_img, books.description, books.content,books.name_book, books.id_book, authors.author, genre.genre
    FROM authors, genre, books_to_author, books, books_to_genre
    WHERE genre.id_genre = books_to_genre.id_genre
    AND authors.id_author = books_to_author.id_author
    AND books_to_genre.id_book = books.id_book
    AND books_to_author.id_book = books.id_book
    AND genre.id_genre = '$id_genre '

Но теперь, делая админку, мне нужно заносить в БД данные и не знаю, как мне правильно сделать INSERT INTO, как связать их правильно, чтобы во все столбцы была запись.

Подскажите, пожалуйста, как это сделать?

Ответы

▲ 5

Судя по всему, Вам придется использовать несколько insert. Если при создании таблиц вы использовали engine=innodb, то можете воспользоваться транзакциями для обеспечения сохранения всех данных и отката в случае ошибок. Например, можете написать так:

->   start transaction;
->     set autocommit=0;
->     insert into table1(col1, col2) values (v1, v2);
->     insert into table2(id, col3, col4) values (last_insert_id(), v3, v4);
->   commit;

Синтаксис можете посмотреть в MySQL мануале...

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

-> create procedure AddBook(author varchar(128), bookname varchar(128), ....)
-> begin
->   start transaction;
->     .....
->   commit;
-> end//

можно добавить книгу единственным вызовом

call AddBook('Steve McConnell', 'Code Complete', ...);

кроме этого, я бы переписал Ваш вызов SELECT используя INNER JOIN:

SELECT books.title, books.min_img, books.description, books.content,books.name_book, books.id_book, authors.author, genre.genre 
FROM books as b 
inner join books_to_author as b2a on b2a.id_book=b.id_book
inner join authors as a on a.id_author=b2a.id_author 
inner join books_to_genre as b2g on b2g.id_book=b.id_book 
inner join genre as g on g.id_genre=b2g.id_genre
where g.id_genre='$id_genre';