2010-07-29 2 views
1

에서 ID를 생성 재기 : 테이블에내가 형식의 쿼리를 실행하려는 여러 삽입 쿼리

INSERT (필드 1을 FIELD2) SELECT 필드 1, FIELD2 테이블에서 WHERE 아이디 IN (4, 8, 15, 16, 23, 42)

여기서 id는 auto_increment'ing 기본 키 table입니다.

이 문장을 실행 한 후에 생성 된 모든 새 ID가 무엇인지 알고 싶습니다. 이 정보를 어떻게 복구 할 수 있습니까? 나는 어쩌면 저장 프로 시저에서이 일을하고 새로 생성 된 ID의 목록을 내 응용 프로그램 코드 (PHP라고 말하면 됨)에 반환하는 것에 관심이있다. IN 절에 나타나는 것과 상관 관계가있는 순서로 목록을 원한다. SELECT 하위 쿼리의. 내 응용 프로그램 코드에서 많은 순차적 INSERT를 절약 할 수 있다고 생각합니다. 그것은 성취 할 수 있습니까?

답변

3

테이블을 제어 할 수 있거나 다른 테이블을 만들 수있는 경우 "transaction_id?" 당신이 당신의 테이블에 추가 한 경우

, 당신은 이런 식으로 뭔가를 할 수 :

Declare @tranId int 
Select @tranId = Max(transaction_id) + 1 from [table] 
Insert Into [table] (field1, field2, transactionId) 
Select field1, field2, @tranId 
From //the rest of your query 

그런 다음 새 ID를 당겨 것 : 참고로

Select Id from [table] where transaction_id = @tranId 

을, 당신은 좋겠 저장 프로 시저의 일부로 즉시 쿼리를 실행해야하거나 여러 동시 삽입에 대해 걱정하지 않고 올바른 행을 가져올 수 있도록 어딘가에서 사용한 transactionId를 저장해야합니다.

+0

MySQL을 다시 작성하면 포인트가 생길 수 있습니다. – Wrikken

+0

MySql 태그가 완전히 누락되었습니다. 확실하지 않은 방법 ... SQL의 대부분의 종류에 보편적이지 않을 유일한 것은 Max()에 대한 호출 일 것이라고 생각하지만, 나는 생각할 것입니다 ... – AllenG

+0

그럼에도 불구하고 이것은 흥미로운 대답입니다 ... 만약에 id 필드 만있는 더미 테이블을 유지하면이 유형의 쿼리를 수행하려는 사람이 먼저 더미 테이블에 삽입을 수행하여 삽입 ID를 복구 할 수 있으므로 해당 테이블이 transaction_id "티켓"이됩니다. 그런 다음 INSERT INTO ... SELECT 문에서 상수로 SELECT 할 수 있습니다. 삽입물이 "순서대로"발생하는 한, 이후에 ID로 정렬 된 트랜잭션 티켓에 SELECT를 수행하여 복구 할 수 있어야합니다. – vicatcu

3

나는 그렇게 생각하지 않는다. 적어도 신뢰할만한 방법은 아닙니다. LAST_INSERT_ID()는 확장 삽입에서 첫 번째 자동 생성 ID를 반환합니다. 이보다 더 높은 값이이 삽입 동안에 삽입되었다고 가정 할 수도 있지만, 많은 경우에 틀릴 수 있습니다 (특히 한 번에 한 명 이상의 데이터베이스에서 작업하는 경우).

+0

실제로 안정적으로 작동하지 않습니다. 저장 프로 시저에서 하나의 삽입을 수행하여 커서를 선택 항목 위로 돌릴 수 있습니다. – Wrikken

+0

@Wrikken - 예, 그들이 Eeeeevillll 인 경우! ;) – AllenG

+0

내 응용 프로그램 코드 (예 : 네트워크를 통해)에서 순차적으로 쿼리를 실행하는 것보다 훨씬 빠릅니까? – vicatcu

0

그래서 ID는

$ids = range($lastID - (--$rows), $lastID); 

것입니다 ... 당신은 마지막 삽입 ID를 얻을 수 있지만 영향을받는 행을 얻을 수 있습니다 - 당신이 너무 마지막 ID를 유지하기 원하는 $ 행을 .

예 : 마지막 인서트는 18과 3 행에 영향을 미치므로 16,17,18은 아이디가되지만 18-3은 15를 산출하므로 아이디가 15,16,17,18로 잘못되었습니다!

+0

당신은 더 많은 8000 행에 영향을 미쳤다고 말할 수 있습니다 ... – vicatcu

+0

동일한 보유 사실 ... –

+0

나는 문제가 삽입 중단이 발생하지 않을 것이라고 보장 할 수 없다고 생각합니다 ... 그래서 순차적으로 보장되지 않습니다. auto_increment id가 중단없이 생성됩니다. – vicatcu

관련 문제