2010-12-02 4 views
1

두 개의 테이블, Items 및 Class_Items에 데이터를 삽입해야합니다. 세 번째 테이블 인 Classes는 여기에 관련되어 있지만 삽입되지는 않습니다.자동 증가 필드를 삽입하는 가장 좋은 방법은 무엇입니까? (PHP/MySQL)

Items의 기본 키는 Item_ID이며 자동 증가 정수입니다. 이 기본 키 외에 항목에는 고유 한 필드가 없습니다. Item_ID가 Class_Items의 Classes와 일치하는지 알아야합니다.

이것은 모두 PHP 인터페이스를 통해 수행됩니다. 가장 좋은 방법은 Item을 삽입하고 Item_ID를 Class_Items에 매치시키는 것이 무엇인지 궁금합니다. 여기에 내가 보는 두 가지 옵션이 있습니다 :

  • INSERT 각 항목은 다음 Class_Items 삽입 쿼리의 ITEM_ID를 얻을 수에 mysql_insert_id()를 사용합니다. 즉, 모든 항목에 대해 하나의 쿼리 (총 수천 개의 쿼리)를 의미합니다.
  • 다음 자동 증가 ID를 가져온 다음 $ item_id 변수에 계속 추가 할 수 있도록 Class_Items 테이블을 잠급니다. 이것은 단지 두 개의 쿼리를 의미합니다 (항목과 Class_Item에 대해 각각 하나씩)

가장 좋은 이유는 무엇입니까? 또한 비공개 대안이 있다면 가장 효율적인 모든 것을 열어 둡니다.

+2

정기적으로 수천 개의 항목을 추가하는 경우가 아니라면 첫 번째 대안에서 언급 한 "쿼리 비용"은 일반적인 문제가되지 않을 것입니다. 처음 아이템을 가져 오는 동안 그것은 단지 당신을 물 것입니다. 그것은 분명히 당신의 구체적인 문제에 달려 있습니다. – eykanal

+0

충분합니다. 나는 여전히 스테이크가 그렇게 높지는 않지만 어떤 것이 더 나은지 궁금해하고 있습니다. 앞으로 수십만 개를 처리 할 것입니다. – babonk

+0

mysql_insert_id()는 쿼리가 아닙니다. 이전 질의의 값을 나타낼뿐입니다. 무시할 수없는 오버 헤드. – dkretz

답변

0

가장 효율적인에서 사용자 ID를 저장할 아마 매개 변수화 된 쿼리를 사용하는 것입니다. mysqli 함수를 사용해야하지만, 이런 종류의 쿼리를 최적화해야 할 필요가 있다면 어쨌든 거기에 있다고 생각해야합니다.

아무리 자르더라도 두 개의 인서트를 만들 수 있습니다. 첫 번째로, 설명했던 것처럼 새로운 ID 값을 얻습니다 (값이 중요하기 때문에 약간의 오버 헤드가 발생합니다). 그리고 두 번째 삽입에서이 값을 사용하는 것은 아주 간단합니다.

0

저장 프로 시저 및/또는 트랜잭션을 사용하여 아무런 문제가 발생하지 않았는지 조사 할 것입니다.

1

내가 초기에 형 BIGINT라는 VALUE의 한 필드 SEQUENCE라는 테이블을 만들어 : 내가 MySQL과 내가 무슨 짓을 가진 프로젝트에서 일하고 있어요

+0

확실히 트랜잭션을 사용하려고합니다. – babonk

0

은 (자동 증가 필드를 사용하지 않고) 다음이다 이 테이블은 새 레코드를 삽입 할 때마다 증가 할 id 값을 저장합니다.

2 스토어 프로 시저를 작성하고 트랜잭션 내에서 스토어드 프로 시저를 작성하고 내부에서 ID 증분을 처리하십시오.

다음은 예입니다. 내 경우

CREATE PROCEDURE `SP_registerUser`(

IN _username VARCHAR(40), 
IN _password VARCHAR(40), 

) 
BEGIN 

DECLARE seq_user BIGINT; 

START TRANSACTION; 

#Validate that user does not exist etc.......... 


     #Register the user 
     SELECT value FROM SEQUENCE INTO seq_user; 
     UPDATE SECUENCE SET value = value + 1; 

     INSERT INTO users VALUES(seq_user, _username, SHA1(_password)); 

     INSERT INTO user_info VALUES(seq_user, UTC_TIMESTAMP()); 


COMMIT; 

END // 

내가 두 개의 서로 다른 테이블 (사용자 및 user_info)

관련 문제