2010-12-05 5 views
1

나는 사용자 계정이있는 웹 사이트를 구축하는 데 익숙하기 때문에 내부적으로 사용자 ID로 해당 사용자를 식별하는 동안 사용자 ID를 자동으로 증가시킨 다음 로그인 할 수 있습니다. 이 경우에해야 할 일은 조금 다릅니다. 나는 익명으로 사람들로부터 몇 줄의 데이터를 모아야하고 그 줄들을 묶어서 어떤 데이터 행이 어떤 사용자에 속하는지 쉽게 알아낼 수 있어야한다.중복 ID를 보장하면서 여러 테이블을 업데이트하려면 어떻게해야합니까?

어려운 점은 데이터 행을 묶는 ID를 생성하는 데 어려움이 있습니다. 나의 첫 번째 생각은 존재하는 가장 높은 사용자 ID에 대해 데이터베이스를 폴링하고 사용자 ID +1로 데이터베이스에 쓰는 것입니다. 그러나 두 제출이 둘 중 하나가 쓰기 전에 데이터베이스를 폴링하는 경우 실패합니다. 각 사용자는 동일한 사용자 ID를 공유합니다.

또 하나의 생각은 자동 증가로 설정된 별도의 사용자 ID 테이블을 작성한 다음 단순히 새 행을 생성 한 다음 작성된 마지막 행의 ID에 대해 해당 테이블을 폴링하는 것입니다. 위의 이유와 동일한 이유로 실패합니다. 두 개의 제출이 최신 사용자 ID로 폴링하기 전에 행을 작성하면 ID가 공유됩니다.

아이디어가 있으십니까? 나는 명백한 것이 빠져 있다는 인상을 받는다.

답변

2

나는 당신을 올바르게 이해하고 있다고 생각합니다. 비슷한 문제가 발생했습니다. 그러나, 매우 편리한 PHP 기능이 있습니다. 데이터베이스를 조회 한 후 새로운 행을 삽입하는 자동 증가 자신의 사용자 ID, 수행

단지 현재의 MySQL의 연결에 이전 쿼리에서 자동 증가 값을 반환
$user_id = mysql_insert_id(); 

. 필요한 경우 here에 대해 자세히 알아볼 수 있습니다.

그런 다음 두 번째 테이블의 데이터를 채우는 데 사용할 수 있습니다. 아무도 첫 번째 테이블에서 중복 된 ID를 얻지 못하도록합니다.

+0

매우 흥미롭고 편리합니다! 이것은 내가 필요한 것입니다. 함수가 해당 데이터를 가져 오기 위해 어떤 종류의 SQL 쿼리를 사용하고 있습니까? 아니면 이전 삽입 쿼리와 함께 반환됩니까? 설명서가 명시되어 있지 않습니다. –

+0

그냥이 MySQL 함수를 호출하는 것 같습니다 : http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id –

+0

두 번째를 잡아 ... wouldn ' 내 다른 두 가지 아이디어와 동일한 문제가 발생합니까? 다른 사용자가 첫 번째 사용자의 게시물과 첫 번째 "mysql_insert_id()"사이에 게시되면 ID가 공유됩니다. ID가 원래 삽입 쿼리와 함께 반환되지 않는 한이 함수는이 ID를 참조합니다. –

2

사용자를 삽입하고 자동 생성 된 ID를 얻은 다음 상위 레코드와 연결할 필요가있는 행 몇 개에서이 ID를 외래 키로 사용해야합니다. 모자 걸이가 모자를 걸기 전에 반드시 있어야합니다.

+0

맞습니다. 정확한 자동 생성 ID를 얻는 것이 어렵다는 것이 확실합니다. –

+0

mysql_insert_id()가 작동 할 때 동일한 연결을 열어 둔 채로 있으면 연결에 적용 할 수있는 올바른 연결이 보장됩니다. 연결에 대한 다른 쿼리를 실행하기 전에 호출해야합니다 (INSERT가 걱정되면). – zanlok

2

이것은 일반적인 문제이며이를 해결하기 위해 transaction을 사용합니다. 이것은 당신에게 하나 이상의 것을 할 수있는 원자 적 사고를 제공하지만, 성공 또는 실패 패키지에 묶여 있어야합니다. 고급 DB 기능이기 때문에 가능한 한 내결함성을 구현하기 위해 좀 더 고급 프로그래밍에 대한 인식이 필요합니다.

+0

가능한 경우 트랜잭션을 피하고 싶었습니다. 믿을 수 없을 정도로 간단한 응용 프로그램에 많은 복잡성을 추가하는 것처럼 보였으므로. –

관련 문제