Вставка данных в несколько связанных таблиц одновременно

70
18 ноября 2021, 03:50

Хотел бы поинтересоваться, как добавлять данные в связанные таблицы одним запросом. На рисунке изображена схема БД. Как добавить автора и книгу так, чтобы их ИД добавилось в центральную таблицу? БД на MySQL.

Answer 1

1 запросом никак не выйдет.

Сначала делаете вставку в authors и books, а потом в book_authors.

Т.е получается 3 запроса.

А если у вас authors и books имеют ID, которые генерируются(Identity), то вам их понадобится получить, а это еще +2 запроса.

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

Это я пишу по опыту использования MS SQL, так как не указана конкретная СУБД, но в других СУБД я такого не встречал.

Да, если говорить в разрезе ORM под СУБД, например Entity Framework, то он автоматически заполняет центральную таблицу, но он все равно за "кулисами" вызывает запрос на вставку.

Answer 2

Вы не указали СУБД! В PostgreSQL, благодаря нестандартному расширению RETURNING, можно сделать так:

WITH new_authors(id) AS (
  INSERT INTO authors
    (         name)
  VALUES
    ('Ivan Ivanov')
  RETURNING id
)
, new_books(id) AS (
  INSERT INTO books
    (         title)
  VALUES
    ('Ivan''s Book')
  RETURNING id
)
INSERT INTO book_authors (author_id, book_id)
SELECT new_authors.id, new_books.id
  FROM new_authors CROSS JOIN new_books
;
SELECT * FROM book_authors;

В других СУБД, где этого или подобного расширения нет, скорее всего нельзя.

Answer 3

Принял решение использовать транзакции, как посоветовали выше. вот пример, может кому-то поможет

START TRANSACTION;
SET AUTOCOMMIT = 0;
INSERT INTO authors(author_name) VALUE ('Vern');
SET @a = LAST_INSERT_ID();
INSERT INTO books(title) VALUE ('Captain');
SET @b = LAST_INSERT_ID();
INSERT INTO books_data(author_id, book_id) VALUES (@a, @b);
COMMIT;
READ ALSO
Структура базы данных, laravel

Структура базы данных, laravel

На сайте на разных страницах должен выводиться контент, редактируемый из админкиИ контент по своей структуре разный: на некоторых страницах...

310
Порождение подмножеств алгоритм

Порождение подмножеств алгоритм

Изучаю книгу АЛааксонена "Олимпиадное программирование"

238
Как правильно сконфигурировать CMakelist файл?

Как правильно сконфигурировать CMakelist файл?

У меня есть два набора файлов (основной и дополнительный) и я хотел бы держать их отдетьно друг от друга

237
Двоичный код, как разделить по 4 символа

Двоичный код, как разделить по 4 символа

Я не понимаю как грамотно сделать, что бы при выводе ответа - символы делились по 4 части (не так(10101010) -> а вот так (1010 1010))

270