我在其中一个表上有一个奇怪的行为,我不确定它是我的php代码还是数据库上的一些设置导致自动增加的id不同步。
如果我在名称和汽车上没有任何索引的情况下运行以下代码,我会得到:
$cars = array("Volvo","BMW","Toyota");
$name = "John Smith";
foreach($cars as $value)
{
try
{
//insert into database with a prepared statement
$query = $db->prepare(
'INSERT INTO cars (name,cars)
VALUES (:name,:cars)
');
$query->execute(array(
':name' => $name,
':cars' => $value
));
}
//else catch the exception and show the error.
catch(PDOException $e)
{
$error[] = $e->getMessage();
}
}
///Results
id || name || cars
1 || John Smith || Volvo
2 || John Smith || BMW
3 || John Smith || Toyota
但是,如果我在名称和汽车上添加一个唯一索引,则自动增量会不同步,我无法理解为什么,因为我无法看到我的PHP代码有什么问题?
$cars = array("Volvo","BMW","Toyota");
$name = "John Smith";
foreach($cars as $value)
{
try
{
//insert into database with a prepared statement
$query = $db->prepare(
'INSERT INTO cars (name,cars)
VALUES (:name,:cars)
');
$query->execute(array(
':name' => $name,
':cars' => $value
));
}
//else catch the exception and show the error.
catch(PDOException $e)
{
$error[] = $e->getMessage();
}
}
///Results
id || name || cars
3 || John Smith || Toyota
1 || John Smith || Volvo
2 || John Smith || BMW
答案 0 :(得分:2)
为什么你认为,这是不同步的?约翰的丰田仍然是3
,他的沃尔沃是1
。
你如何得到你的结果?您只是SELECT
cars
,对吧?行为很好,因为没有任何ORDER BY
语句没有必要按id排序数据。
您应该使用SELECT id, name, cars FROM cars ORDER BY id ASC
进行查询。
使用mysql完全可以返回无序列表。 “unorder”只是一些内部优化的结果。
答案 1 :(得分:0)
两件事。
首先,自动增量通常会结束"不同步"以这种或那种方式。请查看MySQL AUTO_INCREMENT does not ROLLBACK,了解一个非常好的示例,说明为什么您不能期望自动增加主键ID同步"同步"与您的数据。 id是唯一的,它会递增。关于自动增量,你真的可以说的全部。
这导致了第二点。您当然不能说自动增量字段不会有间隙或将按排序顺序返回给您,除非您坚持它(@omeinusch和Mark Baker都在上面指出,并且它们都是正确的) 。在这里,我想指出的是,您的自动增量的行为完全符合预期。插入另一行。它的id为4。开始插入事务,将其回滚,然后插入另一行。它的id为6。这是故意的。插入100行,将其向后滚动,然后再插入100行。那批100将具有自动增量ID> 100.除非您在查询中添加ORDER BY id,否则他们不会按排序顺序返回给您。这是故意的。并且真的没有什么"不同步"关于它。