2009-10-16 5 views
0

나는 eshop 주문을위한 데이터를 보관할 두 개의 MySQL 데이터베이스 테이블을 가지고 있습니다. 그들은 같은 (매우 단순화 된 버전)으로 내장하고 있습니다 :MySQL 트랜잭션 내에서 자동 증가 ID 유지

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에 해당합니다.

나는 새로운 주문을하기 위해 거래를 사용하고 있지만 위의 관계를 유지하는 데 문제가 있습니다. 주문 ID를 새로 받으려면 주문 INSERT 쿼리를 커밋하고 자동 증가 ID를 가져온 다음 주문 항목에 대한 다른 트랜잭션을 시작해야합니다. 어느 것이 트랜잭션 사용의 이점을 거의 없애줍니다.

나는 다음 시도 내가 일하는 것이 가정

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

같은 것을 주문 테이블에 새로운 질서를 삽입 할 수있다. 그러나 첫 번째 주문 항목이 삽입 된 후 LAST_INSERT_ID()은 주문 ID를 반환하지 않고 대신 주문 항목 ID를 반환하므로이 쿼리를 사용하여 다른 주문 항목을 삽입 할 수 없습니다.

이 모든 일을 단일 거래 내에서 처리 할 수있는 방법이 있습니까? 아니면 포기하고 대신 절차를 사용해야합니까?

+0

이것은 잘못되었습니다. "주문을 INSERT하고, 자동 증가 ID를받은 다음 주문 항목에 대해 다른 트랜잭션을 시작해야합니다." 나는 항상 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

auto_imcrement 인 id를 삽입하므로 order_items에 값을 삽입 할 때 LAST_INSERT_ID()가 변경되기 때문에 LAST_INSERT_ID()도 계산할 수 없습니다. 아마도 이것을 시도 할 수 있습니다.

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

제안한 내용은 경쟁 조건을 만듭니다. 두 사람이 동시에 주문을 삽입하면 그 중 하나가 잘못된 ID를 받게됩니다. – longneck