mysql_insert_id()的行为

时间:2011-01-19 09:14:53

标签: php mysql

我正在使用php库中的函数,它不时地使用mysql_insert_id()。现在我修改了一些将数据插入表中的函数,以便明确指定主键值,例如当表最初有10行时,我插入一个ID = 300的行,然后是ID = 200的行。我想知道mysql_insert_id是否会按预期运行,即返回我为AUTO_INCREMENT PRIMARY KEY列明确指定的值。

3 个答案:

答案 0 :(得分:4)

表:

CREATE TABLE `foo` (
  `id` int(11) NOT NULL auto_increment,
  `value` varchar(32) NOT NULL,
  PRIMARY KEY  (`id`)
) ;

代码:

print phpversion()."\n";
mysql_connect('localhost','user','pass');
mysql_select_db('database');

mysql_query('INSERT INTO `foo` (`id`,`value`) VALUES(100,"bar")');
print var_export(mysql_insert_id())."\n";

mysql_query('INSERT INTO `foo` (`value`) VALUES("zoid")');
print var_export(mysql_insert_id())."\n";

mysql_query('INSERT INTO `foo` (`id`,`value`) VALUES(99,"yargh")');
print var_export(mysql_insert_id())."\n";

$q = mysql_query('SHOW TABLE STATUS LIKE "foo"');
$status = mysql_fetch_assoc($q);
mysql_free_result($q);
print $status['Auto_increment']."\n";

mysql_query('INSERT INTO `foo` (`value`) VALUES("whatever")');
print var_export(mysql_insert_id())."\n";

输出:

5.2.XX-0.dotdeb.1
100
101
99
102
102

TL / DR版本:它返回最后一个id,无论是自动递增还是显式给定。

更新:按照Mchl的建议,将INSERT添加到id < 100

答案 1 :(得分:4)

答案是肯定的,

它将返回您输入的值。我喜欢这个问题所以我实际上在多个配置不同的服务器中尝试了多次。

它将返回您插入的值,

mysql_insert_id()返回auto_increment feild的值,不需要自动生成。

如果您尝试为密钥提供dupilcate值,它也将返回0,因为它无法正确插入。

如果您想尝试,请使用以下查询

- 编辑..有更多插页

<?php
$link = mysql_connect('localhost', 'root', 'techping');
if (!$link) {
    die('Could not connect: ' . mysql_error());
}
mysql_select_db('test');

mysql_query("INSERT INTO test (id, name) values (100,'kossu')");
printf("Last inserted record has id %d<br />", mysql_insert_id());
mysql_query("INSERT INTO test (id, name) values (125,'kossu')");
printf("Last inserted record has id %d<br />", mysql_insert_id());
mysql_query("INSERT INTO test (id, name) values (121,'kossu')");
printf("Last inserted record has id %d<br />", mysql_insert_id());
mysql_query("INSERT INTO test (id, name) values ('','kossu')");
printf("Last inserted record has id %d<br />", mysql_insert_id());
mysql_query("INSERT INTO test (id, name) values (250,'kossu')");
printf("Last inserted record has id %d<br />", mysql_insert_id());
?>

结果:

Last inserted record has id 100 
Last inserted record has id 125
Last inserted record has id 121
Last inserted record has id 126
Last inserted record has id 250

当我在121之后让autoincrement生成id时,它会在最大id后生成下一个值(126)(即本例中为125),而不是122

答案 2 :(得分:0)

我不会认为会。它应该返回0:

  

前一个成功查询为AUTO_INCREMENT列生成的ID,如果前一个查询未生成AUTO_INCREMENT值,则为0;如果未建立MySQL连接,则为FALSE。 - http://php.net/manual/en/function.mysql-insert-id.php

未生成ID,因此应返回0.

事实证明,实际情况并非如此。