2011-01-19 43 views
3

我使用从使用mysql_insert_id()飘飞一个PHP库函数。现在我修改了一些将数据插入到表中的函数,以便明确指定主键值,例如当表格最初有10行时,我插入ID = 300的行,然后插入ID = 200的行。我想知道如果mysql_insert_id将按预期行事,即返回我为AUTO_INCREMENT PRIMARY KEY列显式指定的值。行为mysql_insert_id()的

+2

你ñ如果使用特定键插入,请正确使用auto_increment主键。 – 2011-01-19 09:18:40

+0

是的,但...:) – 2011-01-19 14:24:57

+0

如果有人想知道,我试图用`user_add`(http://wiki.phpbb.com/display/DEV/Function.user_add)函数同步我的用户和phpbb3用户表,并明确定义一个值为`user_id`确实起作用。 – 2011-01-19 14:38:15

回答

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,将它自动递增,或明确给出。

更新:增加INSERTid < 100,如Mchl建议。

0

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

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

的ID,因此应返回0

正如已经证明,在实践中这种情况并非如此。

+0

+1是的,和上面一样。 – Mike 2011-01-19 09:27:15

4

答案是肯定的,

它会返回你输入的值。我喜欢这个问题,所以我实际上在不同配置的多台服务器上尝试过多次。

就会返回你插入值,

的mysql_insert_id()返回AUTO_INCREMENT费尔德的价值,它不必是自动生成的。

它也将返回0,如果你试图为你的钥匙给dupilcate价值,因为它不会得到正确插入。

,如果你想尝试,然后用下面的查询

--edit ..更多的刀片

<?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 

看的时候让自动增量产生的ID 121之后,它产生最大的ID之后的下一个值(126)(即,在这种情况下125),而不是122