最后一行在MYSQL中返回不正确的值

时间:2013-07-02 02:23:38

标签: php mysql

我有一张33000+行的表格。当我执行插入查询时,它只返回126 + (auto_increment)

$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已经存在。

更新:

  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();
  }

3 个答案:

答案 0 :(得分:0)

您应找到MAX(id),然后执行以下查询

  ALTER TABLE tablename AUTO_INCREMENT = max_id +1;

答案 1 :(得分: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 TABLESHOW TABLE STATUS

如果您的表格一直给您带来问题,请尝试在https://dba.stackexchange.com/询问有关表格详情的问题。


原始答案:

来自mysql_insert_id文档:

  

注意

     

mysql_insert_id()会将原生MySQL C API函数mysql_insert_id()的返回类型转换为long的类型(在PHP中名为int)。如果您的AUTO_INCREMENT列的列类型为BIGINT(64位),则转换可能会导致值不正确。而是在SQL查询中使用内部MySQL SQL函数LAST_INSERT_ID()。有关PHP的最大整数值的更多信息,请参阅整数文档。

如果您运行新查询SELECT LAST_INSERT_ID()而不是使用mysql_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();
}

答案 2 :(得分:0)

解决了这个问题。这是一个索引集! mysql_insert_id()很好!