2010-05-28 4 views
2

저는 PHP를 처음 사용합니다. 이것이 바보 같은 질문으로 보인다면, 용서해주십시오.하나의 다중 행 삽입 문에 의해 생성 된 행의 모든 ​​ID를 얻는 방법

말해 MySQL 삽입 문 insert into table (a,b) values (1,2),(3,4),(5,6) 말해. 테이블 '테이블'에는 'id'라는 자동 증분 필드가 있습니다.

위의 삽입 문으로 생성 된 모든 ID를 검색하려면 어떻게해야합니까?

mysqli를 사용하는 예제가 있으면 좋을 것입니다.

+0

삽입 한 개수를 아는 경우 MAX (ID) 합계 쿼리로 무엇인가 할 수 있습니까? – Nitrodist

+0

왜이 신분증이 모두 필요합니까? 삽입하는 데이터는 무엇입니까? –

+0

@Nitrodist 오, 안돼! 수천 번 씁니다 : ** id는 숫자가 아닙니다! ** –

답변

1

수 없습니다. 나는 당신이 자신의 id (guid 또는 자신의 자동 증분 테이블 사용)를 유지하고 테이블에 삽입 할 때 사용하는 것이 좋습니다.

그러나 대한 자동 증가 값을 얻을 수의 마지막 LAST_INSERT_ID()를 사용하여 삽입 :로

http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

+0

다른 테이블에 행을 삽입하는 요청이있을 수 있으므로 last_insert_id()를 신뢰하지 않습니다. 내가 틀렸다면 나를 바로 잡아주세요. –

+0

@Curious Jo http://php.net/last_insert_id가 문제를 해결할 수 있습니다. –

0

을 AngeDeLaMort 후속 : 당신은 당신의 삽입물을 분리해서 그것에게 뭔가를 할 수 this :

$data = array (
    array(1,2), 
    array(3,4), 
    array(5,6) 
); 
$ids = array(); 

foreach ($data as $item) { 
    $sql = 'insert into table (a,b) values ('.$item[0].','.$item[1].')'; 
    mysql_query ($sql); 
    $id[] = mysql_insert_id(); 
} 

이제 새 ID는 모두 $ id 배열에 있습니다.

+0

나는 이것도 생각하고 있었다. 그러나 효율적이지 않습니까? 나는 데이터베이스를 여러 번 치는 것을 의미합니까? –

1

AngeDeLaMort의 답변이 거의 맞습니다. 물론, 문제를 해결하는 가장 적절한 방법은 한 번에 한 행을 삽입하고 insert_id를 폴링하거나 다른 위치에서 시퀀스를 생성하는 것입니다 (이는 확장 성 측면에서 추가적인 이점이 있습니다).

나는 후 삽입이 가장 최근의 INSERT_ID 을 마지막 INSERT_ID를 결정하기 위해 노력하고 비교에 대해 강력히 권장 것 - 이것이 실패 할 수있다 방법이 너무있다.

하지만 ...

은 다른 방법은 다음과 같습니다

.... 
"INSERT INTO destn (id, data, other, trans_ref) 
SELECT id, data, other, connection_id() FROM source"; 
.... 
"SELECT id FROM destn WHERE trans_ref=connection_id()"; 
.... 
"UPDATE destn SET trans_ref=NULL where trans_ref=connection_id()"; 

두 번째 쿼리가 생성 된 ID를 반환 (이 모든 3 개 쿼리에 대해 동일한 연결을 사용하는 것이 가정합니다)합니다. 세 번째 쿼리는 연결 ID가 연결 해제 (다시 사용) 될 때 풀로 돌아 가기 때문에 필요합니다.

C.

0

는 어쩌면 나는이

$insert = "insert into table (a,b) values (1,2),(3,4),(5,6)"; 
$mysqli->query($insert); 
$rows_to_be_inserted=3; 
$inserted_id = $mysqli->insert_id // gives me the id of the first row in my list 
$last_row_id = ($inserted_id+$rows_to_be_inserted)-1; 
$mysql->query("select * from table where id between $inserted_id and $last_row_id"); 

무엇에 사람이 말을 할 수 있습니까?

1

UserID와 같은 다른 정렬 식별자가있는 경우 UniqueID가 mysql_insert_id()보다 크거나 같은 쿼리를 필터링 할 수 있으며 영향을받는 행 수로 제한하고 사용자가 표시 한 값만 표시 할 수 있습니다 . 이것은 실제로 트랜잭션 내부에서만 작동합니다.

$SQL = "INSERT INTO Table 
     (UserID, Data) 
     VALUES 
     (1,'Foo'), 
     (1,'Bar'), 
     (1,'FooBar')"; 

$Result = mysql_query($SQL); 
$LastID = mysql_insert_id(); 
$RowsAffected = mysql_affected_rows(); 

$IDSQL = "SELECT RecordID 
      FROM Table 
      WHERE UserID = 1 
      AND RecordID >= '$LastID' 
      LIMIT '$RowsAffected'"; 
$IDResult = mysql_query($IDSQL); 
관련 문제