SQL

Как сделать автопостановку индексов?

Есть таблица выдача (id_book,id_reader,да_выдачи, дата_возврата)
так вот id_book должно браться с таблицы book
Наверное имеется ввиду не индексов, а id книг .
В теории сделать МОЖНО, но нужно понимать какие условия входа.
Я так подозреваю что у вас есть таблица книг и таблица выдачи книг, которые связаны ключами по книги (id) <-> выдача (book_id). Т. к. по задаче у вас стоить найти book_id, подозреваю что на входе у вас есть имя книги.
Я сейчас опишу схему, как можно сделать автоподстановку айдишников, НО подход нарушает правила нормализации БД, которые рекомендованы при проектировании структуры базы, критичного с собой это ничего не несет и в своих проектах это в целом можно использовать.

Итак, в целом как написал оратор выше, нужно делать запрос в таблицу book чтобы по названию книги узнать ее id и уже его вставлять в табилцу выдачи книг ( абсолютно та же история с reader_id, нужно по имени того кто взял книгу найти его айди, чтобы указать в этой таблице), но избежать в коде лишних запросов к базе и для большей чистоты кода эту логику можно вынести внутрь базы с помощью триггера на таблицу. Можно изменить таблицу выдачи книг, добавить столбец book_name и писать сюда имя которое у нас есть изначально (именно это и нарушает нормализацию бд) плюс заранее вешаем на таблицу триггер AFTER INSERT с параметром on each row и здесь обьявзяем переменную book_id int; ,затем с помощью new.book_name получаем имя книги, далее делаем запрос в таблицу book - select id into book_id from book where book_name = new.book_name, и далее выполняет update выдачи книг new.book_id = book_id.

Как это будет выглядеть. Наш внешний код, открывает транзакцию делает вставку в таблицу без айдишника, вставляет только имя книги, база отрабатывает вставку, далее запускается триггер, по только что вставленному имени вытаскивает id этой книги из таблицы book и для только что вставленной строки заполняет поле id, далее триггер завершает свою работу и идет ответ от базы назад во внешнее приложение что запрос выполнен.
В целом это базовый кейс, можно сделать по разному, например не добавлять сюда имя, сделать этой таблице айдишник заполняемый через сиквенс и сделать временную таблицу для всей описанной выше манипуляции с триггером на эту временную таблицу ( писать в нее новый id от сиквенса + book name, на ней же будет триггер и она будет потом делать апдейт назад после селекта в таблицу бук по условию where id = new.id)

Итог, из исходного кода этих манипуляций не будет, просто вставка, дальше все крутится внутри базы. Многие гуру кода скажут что это геморойный подход, проще заселектить из кода и сделать инсерт уже с айдишником, в большинстве случаев оно так и есть, но есть кейсы, когда проще и быстрее поменять логику внутри базы без запуска новых билдов, их деплоя и тд, т. к. можно выключить триггер, обновить его и включить назад ( запусить ручной апдейт затем если данные были вставлены а id не подтянулись)
N.
N.s
795
Лучший ответ
Никак.
Программно делать запрос на таблицу book.
И при вставке в таблицу выдача вставлять значение взятое с book.