我有一张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();
}
答案 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 TABLE
和SHOW 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()很好!