2011-01-10 7 views
2

나는 잠시 동안 기본 MySQL을했지만 그 이상은하지 못했습니다. 테이블에 새로운 행을 삽입 할 때 행이 나에게 되돌아 오게하는 방법이 있는지 궁금합니다. 기본적으로 자동 필드가있는 테이블이 있으며 가능한 빨리 자동으로 해당 자판을 가져오고 싶습니다. 행을 다시 돌려 줄 수 없다면 가장 높은 자동 실행을 위해 두 번째 쿼리를 실행하는 것보다 짧은 시간에해야 할 일이 있습니까? 테이블이 다른 프로세스 또는 사용자에 의해 업데이트되어 더 이상 올바른 번호가 아닌 (약간의, 아주 약간의) 기회가 허용되지 않습니까? 현재는 방금 입력 한 내용으로 정확히 행을 검색합니다. 심지어 문제가있는 것 같습니다.INSERT 명령으로 생성 된 행을 반환하도록 MySQL을 가져 오는 방법이 있습니까?

저는 PHP 5.1과 MySQL 5.0.45를 사용하고 있습니다.

도움 주셔서 감사합니다.

+0

당신은 LAST_INSERT_ID() http://dev.mysql.com/doc/refman/5.1/en/information-functions.html#function_last-insert-id –

+4

NB를 찾고 있습니다 : 당신이 만약 ' PHP에서 mysql_insert_id 함수를 사용하여 ** PHP 내에서 "LAST_INSERT_ID()"SQL 쿼리를 실행하지 마십시오 **. –

+1

@middaparka : 포인트를 신경 쓰는 사람들은 그의 질문에 대답하지 않습니다. 좋은 질문에 감사하고 지식에 관심이있는 사람들은 점수에 신경 쓰지 않습니다. –

답변

4

이 기능을 사용해보십시오 : mysql_insert_id

그것은

+1

이 질문에 대한 답은 2 차 질문입니다. "테이블이 다른 프로세스 또는 사용자에 의해 업데이트되어 더 이상 올바른 번호가 아닌 테이블을 만들 수 있습니까?" –

+1

@aaaa bbbb - PHP의 mysql_insert_id는 쿼리와 동일한 연결에서 호출되므로 항상 해당 쿼리의 ID를 반환합니다. 다른 사용자의 활동에는 영향을받지 않습니다. –

+0

고마워요! 그리고 @middaparka 감사합니다. PDO를 사용하고 있으므로 PDO :: lastInsertId를 사용해야합니다. 누군가 다른 문제를 일으키는 지 아는 사람이 있습니까? –

5

당신은 현재 연결의 범위에있는 작품이다 LAST_INSERT_ID() 사용할 수있는 마지막 쿼리에서 생성 된 ID를 반환합니다.

생성 된 ID는 연결 기준으로 서버에서 유지 관리됩니다. 즉, 해당 클라이언트가 함수에 반환하는 값은 해당 클라이언트가 AUTO_INCREMENT 열에 영향을주는 가장 최근의 명령문에 대해 생성 된 첫 번째 AUTO_INCREMENT 값입니다. 이 값은 다른 클라이언트가 AUTO_INCREMENT 값을 생성하더라도 다른 클라이언트의 영향을받을 수 없습니다. 이 동작은 각 클라이언트가 다른 클라이언트의 활동에 관계없이 잠금 또는 트랜잭션없이 자체 ID를 검색 할 수있게합니다.

자세한 정보 here.

+2

PHP 내에서 "LAST_INSERT_ID()"SQL 쿼리를 실행하지 말아야한다는 middaparka의 의견에 어떻게 답합니까? 나는 내장 된 PHP 함수 mysql_insert_id를 사용할 것이라고 생각한다. –

+0

LAST_INSERT_ID()는 스크립트의 SQL 수준에서는 어디에도 쓰이지 않는다는 것에 동의합니다. PHP에서 가치를 얻으려는 시도가 있다면 middaparka의 조언을 따르는 것이 좋습니다. –

+0

감사 세르게이! PHP 버전을 사용할 예정이지만, 이것에 대해서도 잘 알고 있습니다. –

0

mysql_insert_id를 사용하는 것은 괜찮습니다.하지만 정말로 경쟁 조건을 피하기 위해서는 방금 삽입 한 값으로 삽입 한 후 select를 수행하십시오. 이 값이 고유하지 않으면 이전에 계산 한 시간 소인도 삽입하십시오. http://www.php.net/manual/en/function.mysql-insert-id.php#95584 :

<?php 
$date = date('U'); 
$db->query("INSERT INTO TABLE table VALUES('', 'a', 'b', 'c', 'd', '". $date ."'"); 
$res = $db->query("SELECT id FROM table WHERE a_col = 'a' AND b_col = 'b' AND c_col = 'c' AND d_col = 'd' AND temp_id = '".$date."'"); 
?> 
+2

코드를 복사하는 소스에 연결하는 것은 상처가되지 않습니다. http://www.php.net/manual/en/function.mysql-insert-id.php#95584 – nickf

+0

이것은입니다. 완전히 불필요합니다. PHP의 mysql_insert_id는 연결 기반이므로 실행중인 PHP 스크립트가 다른 SQL 쿼리를 실행하지 않는 한 이전 삽입 ID는 그대로 유지됩니다. –

+0

@middaparke : 자동 증가 필드를 사용하지 않거나 하나의 명령으로 여러 행을 삽입 할 때? – Sergi

관련 문제