私は現在、mysql_insert_id()
を使用しているPHPライブラリの関数を使用しています。今、主キー値が明示的に指定されるようにデータをテーブルに挿入するいくつかの関数を変更しました。テーブルが元々10行あったときに、ID = 300の行とそれに続くID = 200の行を挿入します。 mysql_insert_idが期待どおりに動作するかどうか、つまりAUTO_INCREMENT PRIMARY KEY列に対して明示的に指定した値を返すかどうか疑問に思っています。mysql_insert_id()の振る舞い
答えて
表:
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を返します。
更新:INSERT
をid < 100
と追加しました(Mchlが推奨)。
私は
だと思います。だと思います。
何のMySQLの接続が確立されなかった場合は、前のクエリがAUTO_INCREMENT値を生成する、またはFALSEていない場合は、成功、0で前のクエリによりAUTO_INCREMENTカラム用に生成されたIDを:それは0を返す必要があります。 - http://php.net/manual/en/function.mysql-insert-id.php
IDが証明されているように、これはそうではない、実際には、0
を返すべきであるように生成されていません。
答えは「はい」です。
入力した値が返されます。私はこの質問が気に入ったので、実際には異なる設定を持つ複数のサーバーで複数回試しました。それはあなたが挿入された値を返します
、
に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ではありません。
答え前にテストを行うための+1。 stackoverflowの非常に珍しい動作。 –
- 1. datavalidation/CakePhpの振る舞い
- 2. 序数の振る舞い
- 3. リストポインティングの振る舞いpython
- 4. htmlコードの振る舞い
- 5. POSIXシグナルの振る舞い
- 6. DSE Solr:CopyFieldの振る舞い
- 7. ジャスミンサービスの振る舞い
- 8. バックボーンイベントの振る舞い
- 9. RowNumの振る舞い
- 10. CSSグリッドの振る舞い
- 11. `org.springframework.transaction.annotation.Transactional`の振る舞い
- 12. jQuery slideToggleの振る舞い
- 13. GLSLブランチの振る舞い
- 14. WCF IErrorHandler.ProvideFault()の振る舞い
- 15. emacsリストバッファの振る舞い
- 16. JDialogモダリティの振る舞い
- 17. strange ArrayBufferの振る舞い
- 18. グライドキャッシングの振る舞い
- 19. イメージマージンの振る舞い
- 20. CSSの振る舞い
- 21. UIViewレイアウトの振る舞い
- 22. Cビットシフトの振る舞い
- 23. VB.Netモジュールの振る舞い
- 24. 異なる振る舞い
- 25. 異なる振る舞い
- 26. 奇妙な振る舞い
- 27. Java - 珍しいGridLayoutの振る舞い
- 28. 興味深いプロパティの振る舞い
- 29. 珍しいActiveRecordの振る舞い
- 30. malloc()の面白い振る舞い
特定のキーを使用して挿入する場合は、auto_increment主キーを正しく使用しないでください。 –
ええと...:) –
誰かが不思議に思うような場合、私は 'user_add'(http://wiki.phpbb.com/display/DEV/Function.user_add)関数を使ってphpbb3 usersテーブルとユーザを同期させようとしていて、明示的に値を定義していました'user_id'が動作しました。 –