【问题标题】:Behavior of mysql_insert_id()mysql_insert_id() 的行为
【发布时间】:2011-01-19 09:14:53
【问题描述】:

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

【问题讨论】:

  • 如果您使用特定键插入,则说明您没有正确使用 auto_increment 主键。
  • 如果有人想知道,我试图使用 user_add (wiki.phpbb.com/display/DEV/Function.user_add) 函数将我的用户与 phpbb3 用户表同步,并明确定义 user_id 的值确实有效。跨度>

标签: php mysql


【解决方案1】:

表:

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 的建议添加了 INSERTid < 100

【讨论】:

  • 您的测试缺少的是另一个 id
  • @Mchl 为什么?为了证明,不存在auto_decrement
  • 为了充分展示auto_increment行为。
  • 为了完整起见,是的,需要对 < 100 进行测试,谢谢!
【解决方案2】:

答案是肯定的,

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

它会返回你插入的值,

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 之后生成下一个值(126)(即;在这种情况下为 125),而不是 122

【讨论】:

  • +1 用于在回答之前进行测试。 stackoverflow 的异常行为。
【解决方案3】:

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

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

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

正如已经证明的那样,在实践中情况并非如此。

【讨论】:

    猜你喜欢
    • 2012-01-16
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 2012-01-04
    • 2013-12-01
    • 1970-01-01
    相关资源
    最近更新 更多