Всем доброго вечера. Есть 3 связанные таблицы, примерная схемка на фото
Суть проста: У автора должно быть несколько книг.
Делаю запросы на INSERT в таблицы
К примеру был отправлен post запрос authors.name = 'Gogol', books.title = 'VIY'
добавляем транзакциями все эти данные в таблицы и в books_authors вставляем последние id.
НО, при следующем пост запросе authors.name = 'Gogol', books.title = 'Death Souls' - возникает ошибка, нельзя добавлять дубликат в таблицу authors.
Вопрос в следующем, как мне вернуть id того дубликата, что уже есть в таблице, для вставки в books_authors?
Используйте такую конструкцию
INSERT INTO authors (
name
) VALUES (
'Gogol'
) ON DUPLICATE KEY UPDATE
id = LAST_INSERT_ID(id);
Этот запрос вставит новую запись, если ее нет, и вернет ее id через LAST_INSERT_ID()/mysql_insert_id(). Если же такая запись есть, то выполнится строчка
id = LAST_INSERT_ID(id)
которая по сути не обновляет поля, но устанавливает значение LAST_INSERT_ID.
Для работы данной конструкции по полю name таблицы authors должен быть построен уникальный ключ
INSERT IGNORE INTO books (title)
VALUES ('title 1'), ('title 2'), ... ;
INSERT IGNORE INTO authors (name)
VALUES ('name 1'), ('name 2'), ... ;
INSERT IGNORE INTO books_authors (author_id, book_id)
SELECT authors.id, books.id
FROM authors, books
WHERE (authors.name, books.title) IN ( ('name 1', 'title 1'),
('name 2', 'title 2'),
... );
как мне вернуть id того дубликата
А вот дубликаты надо удалить. ВСЕ.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей