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

を見つけて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 TABLEそしてSHOW TABLE STATUS

テーブルで引き続き問題が発生する場合は、 https://dba.stackexchange.com/でテーブルの詳細を添えて質問してみてください。


元の答え:

mysql_insert_idドキュメントから:

注意

mysql_insert_id()ネイティブの MySQL C API 関数の戻り値mysql_insert_id()の型を( PHPでlong命名された) の型に変換します。列の列タイプが(64 ビット) のint場合、変換によって誤った値が生じる可能性があります。代わりに、SQL クエリで内部の MySQL SQL 関数を使用してください。PHP の最大整数値の詳細については、整数のドキュメントを参照してください。AUTO_INCREMENTBIGINTLAST_INSERT_ID()

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 に答える
0

問題を解決しました。インデックスセットでした!mysql_insert_id() は問題ありませんでした!

于 2013-07-02T04:00:24.547 に答える