2009-10-16 2 views
0

У меня есть две таблицы базы данных MySQL, предназначенные для хранения данных для заказов на эскпаузы. Они построены как таковой (очень упрощенный вариант):Сохранять идентификатор автоинкремента внутри транзакции MySQL

CREATE TABLE `orders` (
`id` int(11) NOT NULL auto_increment 
PRIMARY KEY (`id`) 
); 

CREATE TABLE `order_items` (
    `id` int(11) NOT NULL auto_increment, 
    `orderID` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) 

Отношения между ними состоит в том, что orders.id соответствует order_items.orderID.

Я использую транзакцию для размещения нового заказа, однако у меня есть проблема с сохранением вышеуказанного отношения. Чтобы получить новый идентификатор заказа. Я должен зафиксировать запрос INSERT заказов, получить идентификатор с автоинкрементами и затем начать другую транзакцию для элементов заказа. Который в значительной степени поражает смысл использования транзакций.

я мог вставить новый заказ в таблице заказов, а затем попробовать что-то вроде

INSERT INTO order_items(orderID) VALUES(LAST_INSERT_ID()) 

который я предполагаю, будет работать. Однако после ввода элемента первого заказа LAST_INSERT_ID() прекратит возвращать идентификатор заказа и вместо этого возвращает идентификатор элемента заказа, что делает невозможным использование этого запроса для вставки другого элемента заказа.

Есть ли способ заставить все это работать в рамках одной транзакции, или я должен отказаться и использовать процедуру вместо этого?

+0

это неверно: «Я должен зафиксировать запрос INSERT заказов, получить идентификатор с автоинкрементами, а затем начать другую транзакцию для элементов заказа». Я вижу это все время здесь, в stackoverflow. где вы это узнали? – longneck

+0

@longneck Я думаю, вы неправильно поняли. Это я объяснял тот процесс, который я не хочу следовать. –

ответ

4

это будет работать ?:

INSER QUERY; 
SET @insertid = LAST_INSERT_ID(); 
INSERT INTO `order_items` SET `OrderID` = @insertid; 

Все в одном заявлении. Вам нужно будет дважды проверить синтаксис

+0

или получите значение LAST_INSERT_ID() в вашем приложении и создайте вставку для order_items. – longneck

0

Вы не можете рассчитывать на LAST_INSERT_ID(), потому что он также изменяется, когда вы вставляете значения в order_items, потому что он вставляет свой id, который также является auto_imcrement. Возможно, вы можете попробовать это.

INSERT INTO order_items(orderID) VALUES((SELECT id FROM orders ORDER BY id desc LIMIT 1)) 
+1

то, что вы предложили, создает условие гонки. если два человека вставляют заказы одновременно, один из них получит неверный идентификатор. – longneck