2011-01-19 35 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