2012-05-09 6 views
0

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

У меня есть две таблицы в базе данных 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 выполняются, он будет получать maxorder_id из order таблицы, которая имеет отношение к этому для тех другого клиента и не отношения к шахте в результате сделки в несовместимого состояния!

То, что я хочу спросить, что, как правильно выбирать соответствующий order_id из order таблицы, которая всегда актуальна для конкретного заказа и гарантирует, что не транзакция завершается с несовместимым состоянии в любое время. Каков правильный способ сделать это?

ответ

1

Функция LAST_INSERT_ID() MySQL возвращает возвращаемое автоматически значение с первой успешной вставки последней операции INSERT на текущее соединение.

Ваш MySQL API обычно предоставляет некоторую оболочку вокруг этого вызова функции, например. mysql_insert_id() в PHP.

+0

Предположим, что мой заказ находится в состоянии ожидания (после вставки только в таблицу 'order'). Позже мой заказ начнет обрабатываться после завершения, скажем, 10 заказов, будет ли 'LAST_INSERT_ID()' гарантировать, что 'order_id', извлекаемый из таблицы' order', всегда связан с ** моим ** порядком? – Bhavesh

+0

@Bhavesh: При условии, что другие заказы были вставлены в разные соединения с базой данных MySQL, да. – eggyal

+0

'last_insert_id (order_id)' извлекает все 'order_id' уникальные для определенного соединения. Я, однако, хочу только последних из них. – Bhavesh

Смежные вопросы