2013-07-02 3 views
1

33000+ 개의 행이있는 테이블이 있습니다. 삽입 쿼리를 수행하면 126+ (auto_increment) 만 반환됩니다. 내 테이블에마지막 행은 MYSQL에서 잘못된 값을 반환합니다.

$student_sql = "INSERT INTO students (
      `referrer_id`, 
      `enrolment_date`, 
      `tertiary`, 
      `education`, 
      `status`, 
      `date_added`) VALUES (
      '".database_safe($insertED)."', 
      '".database_safe($enrolment_date)."', 
      '".database_safe($tertiary)."', 
      '".database_safe($education)."', 
      '1', 
      NOW())"; 

      if (database_queryModify($student_sql,$studentID)) { 

      echo $studentID // This returns the incorrect Last ID. 
      } 

내 ID는 AUTO_INCREMENT로 설정하고 내 표는 MyIsam입니다.

마지막으로 ID이 이미 있으므로 삽입에 실패합니다.

UPDATE :

function database_queryModify($sql,&$insertId) 
    { 
    global $db, $SECTION; 

    $result = mysql_query($sql,$db); 

    if (!$result) { 
     if (mysql_error()) { 
      if (DEBUG) { 
       echo 'Could not query:' . mysql_error().'\n'; 
       echo '<br />SQL: '.$sql.'\n'; 
       exit(); 
      } else { 
       LogError($SECTION,81,mysql_error().' | SQL: '.$sql); 
      } 
     } 
    } 

    $insertId = mysql_insert_id(); 

    return mysql_affected_rows(); 
    } 
+0

내 테이블이 잠겨있을 수 있습니까? 현재 행 수가 많기 때문에? – Cliffordwh

+1

우리는 어떻게 "database_queryModify()"라는 괄호가 무엇인지 알고 있어야합니까? –

+0

Hehe ..'MyIslam' –

답변

0

문제가 해결되었습니다. 그것은 색인 집합이었습니다! mysql_insert_id()는 괜찮 았어!

+0

어떤 색인이 설정 되었습니까? – DevZer0

0

당신이 MAX(id)를 찾은 다음 다음 쿼리

ALTER TABLE tablename AUTO_INCREMENT = max_id +1; 
+0

질문은 올바른 'insert_id'를 반환하는 것이지 우리가 생각하는 것으로 인덱스를 "업데이트"하는 방법이 아닙니다. 지금까지는 테이블이 정상적으로 작동합니다. (적어도 다른 질문은 아무 것도 없습니다.) –

0

이 링크를해야한다는 DevZer0 @AUTO_INCREMENT Handling in InnoDB 제안, 아직 테이블 인 이유를 설명하지 않는 것을 확인합니다 예상대로 작동하지 않습니다. 정상적인 조건에서

는 MySQL의 드라이버가 auto_increment ID가 잘못 발견하고 그에 따라 행동합니다 :

mysql> ALTER TABLE test AUTO_INCREMENT=1; 
Query OK, 7 rows affected (0.00 sec) 
Records: 7 Duplicates: 0 Warnings: 0 

mysql> INSERT INTO test VALUES (0,'after alter table'); 
Query OK, 1 row affected (0.00 sec) 

테이블이 점검이 필요할 수 있습니다 CHECK TABLE

테이블 문제가 당신에게주는 유지하면 SHOW TABLE STATUS, 테이블의 세부 사항과 함께 https://dba.stackexchange.com/에 질문을하십시오.


원래 답 : long의 유형에 네이티브 MySQL의 C API 함수 mysql_insert_id()의 반환 형식을 변환합니다

mysql_insert_id()이 (이름

주의 :

문서 mysql_insert_id에서 PHP에서 int). AUTO_INCREMENT 열의 열 유형이 BIGINT (64 비트)이면 변환시 잘못된 값이 발생할 수 있습니다. 대신 SQL 쿼리에서 내부 MySQL SQL 함수 LAST_INSERT_ID()을 사용하십시오. PHP의 최대 정수 값에 대한 자세한 내용은 정수 설명서를 참조하십시오.

mysql_insert_id() 대신 새 쿼리 SELECT LAST_INSERT_ID()을 실행하면 어떻게 될까요?

function db_last_insert_id ($db) { 
    $insert_id = 0; 
    $result = mysql_query('SELECT LAST_INSERT_ID()',$db); 

    if ($result) { 
     $row = mysql_fetch_row($result); 
     mysql_free_result($result); 

     $insert_id = $row[0]; 
    } 

    return $insert_id; 
} 

function database_queryModify ($sql,&$insertId) { 
    global $db, $SECTION; 

    $result = mysql_query($sql,$db); 

    if (!$result) { 
     if (mysql_error()) { 
      if (DEBUG) { 
       echo 'Could not query:' . mysql_error().'\n'; 
       echo '<br />SQL: '.$sql.'\n'; 
       exit(); 
      } 
      else { 
       LogError($SECTION,81,mysql_error().' | SQL: '.$sql); 
      } 
     } 
    } 

    /** 
    * mysql_insert_id misses the "$db" argument here 
    */ 
    // $insertId = mysql_insert_id(); 

    $insertId = db_last_insert_id($db); 

    return mysql_affected_rows(); 
} 
+0

'마지막 ID가 이미 있기 때문에 삽입이 실패합니다. ' – DevZer0

+0

@Ast이 빠른 시도가 있습니다! 감사합니다 – Cliffordwh

+0

귀하의 질문에 편집해야합니다, 그렇지 않으면 downvote을 제거 할 수 없습니다 – DevZer0

관련 문제