В настоящее время я работаю с торговым сайтом электронной коммерции. Совершенно необязательно описывать, что пользователи могут отправлять свои заказы из любого места в любое время.Вставка данных в дочернюю таблицу на основе значений первичного ключа главной таблицы
У меня есть две таблицы в базе данных MySql order
и order_details
(и есть и другие), чтобы поддерживать детали заказа, которые мы можем легко представить, поэтому я думаю, что мне не нужно описывать всю структуру обеих таблиц.
В таблице order
в основном содержит поле, как order_id
которой первичный ключ автоинкрементного, order_date
, order_status
и некоторые другие, которые нам не нужны в этом контексте.
В таблице order_details
в основном содержит поле, как order_id
которых внешний ключ из order
таблицы, product_name
, product_price
и т.д.
Когда клиент отправляет заказ, первую запись, которая должна быть сделана в таблицу order
и на основании order_id
в этой таблице, детали этого заказа вставляются в таблицу order_details
.
Вставка в order_details
таблицы требуется соответствующая order_id
, чтобы быть извлечена из заказа таблицы (который автоматически увеличивается и, следовательно, мы не можем его заранее). В настоящее время я получаю этот order_id
из таблицы order
что-то вроде этого.
select max(order_id) from order;
Этого SQL оператор дает мне последнюю order_id
из order
таблицы и использовать это значение, я могу вставить детали определенного порядка в order_details
таблицы.
Теперь предположим, что я в настоящее время представляю заказ, содержащий некоторые товары в корзине покупок. Мой заказ вставляется в order
таблицу успешно, но перед установкой в order_details
(и до извлечения максorder_id
из order
таблицы), этот процесс включаются прочь планировщиком операционной системы на сервере по некоторым причинам для выполнения другого клиента заказ и обработка заказа другого клиента полностью завершены (вставлены в обе таблицы, order
и order_details
).
После завершения этой обработки заказа (что другой клиента заказ), мой заказ, который до сих пор в ожидании начала выполнения, который был переключен прочь перед извлекая максorder_id
из order
таблицы. Когда выше оператор SQL выполняются, он будет получать max
order_id
из order
таблицы, которая имеет отношение к этому для тех другого клиента и не отношения к шахте в результате сделки в несовместимого состояния!
То, что я хочу спросить, что, как правильно выбирать соответствующий order_id
из order
таблицы, которая всегда актуальна для конкретного заказа и гарантирует, что не транзакция завершается с несовместимым состоянии в любое время. Каков правильный способ сделать это?
Предположим, что мой заказ находится в состоянии ожидания (после вставки только в таблицу 'order'). Позже мой заказ начнет обрабатываться после завершения, скажем, 10 заказов, будет ли 'LAST_INSERT_ID()' гарантировать, что 'order_id', извлекаемый из таблицы' order', всегда связан с ** моим ** порядком? – Bhavesh
@Bhavesh: При условии, что другие заказы были вставлены в разные соединения с базой данных MySQL, да. – eggyal
'last_insert_id (order_id)' извлекает все 'order_id' уникальные для определенного соединения. Я, однако, хочу только последних из них. – Bhavesh