2011-01-19 16 views
3

私は現在、mysql_insert_id()を使用しているPHPライブラリの関数を使用しています。今、主キー値が明示的に指定されるようにデータをテーブルに挿入するいくつかの関数を変更しました。テーブルが元々10行あったときに、ID = 300の行とそれに続くID = 200の行を挿入します。 mysql_insert_idが期待どおりに動作するかどうか、つまりAUTO_INCREMENT PRIMARY KEY列に対して明示的に指定した値を返すかどうか疑問に思っています。mysql_insert_id()の振る舞い

+2

特定のキーを使用して挿入する場合は、auto_increment主キーを正しく使用しないでください。 –

+0

ええと...:) –

+0

誰かが不思議に思うような場合、私は 'user_add'(http://wiki.phpbb.com/display/DEV/Function.user_add)関数を使ってphpbb3 usersテーブルとユーザを同期させようとしていて、明示的に値を定義していました'user_id'が動作しました。 –

答えて

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が推奨)。

+1

あなたのテストに欠けているのは、IDが100未満の別の挿入物、そしてIDのない別の挿入物です。 (自動IDは102になります) – Mchl

+1

@Mchlなぜですか?証明するために、* auto_decrement *のようなものはありませんか? –

+0

auto_incrementの動作を完全に実証するためです。 – Mchl

0

私は だと思います。だと思います。

何のMySQLの接続が確立されなかった場合は、前のクエリがAUTO_INCREMENT値を生成する、またはFALSEていない場合は、成功、0で前のクエリによりAUTO_INCREMENTカラム用に生成されたIDを:それは0を返す必要があります。 - http://php.net/manual/en/function.mysql-insert-id.php

IDが証明されているように、これはそうではない、実際には、0

を返すべきであるように生成されていません。

+0

+1もちろん、上記と同じです。 – Mike

+0

それは多くの推測です。 –

+0

それは間違っていません。私はテストを実行しました。複数のサーバーで –

4

答えは「はい」です。

入力した値が返されます。私はこの質問が気に入ったので、実際には異なる設定を持つ複数のサーバーで複数回試しました。それはあなたが挿入された値を返します

にmysql_insert_id()はAUTO_INCREMENTのフェイルドの値を返し、それが自動生成される必要はありません。

また、適切に挿入されないため、キーの二重引用符の値を指定しようとすると、0が返されます。

あなたは

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

を参照してください。 121以降のIDは、最大のID(この場合は125)の次の値(126)を生成したもので、122ではありません。

+0

答え前にテストを行うための+1。 stackoverflowの非常に珍しい動作。 –