1

我有一张有 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();
  }
4

3 回答 3

0

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

于 2013-07-02T04:00:24.547 回答
0

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

  ALTER TABLE tablename AUTO_INCREMENT = max_id +1;
于 2013-07-02T02:47:09.167 回答
0

此链接验证 @DevZer0在 InnoDB 中提出的 AUTO_INCREMENT 处理,但它没有解释为什么您的表没有按预期工作。

在正常情况下,MySQL 驱动程序会发现auto_incrementid 错误并采取相应措施:

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(以intPHP 命名)。如果您的AUTO_INCREMENT列的列类型为BIGINT(64 位),则转换可能会导致不正确的值。LAST_INSERT_ID()相反,在 SQL 查询中使用内部 MySQL SQL 函数。有关 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();
}
于 2013-07-02T02:49:21.387 回答