如果我的主键不自动递增,如何使用 PHP 获取最后插入的 ID

Posted

技术标签:

【中文标题】如果我的主键不自动递增,如何使用 PHP 获取最后插入的 ID【英文标题】:How to obtain with PHP the last ID inserted if my primary key does not autoincrement 【发布时间】:2012-04-06 11:09:25 【问题描述】:

我在 mysql 中有一个表,出于兼容性问题,我们分配了特定的主键,因此它们不能自动递增。

每次我们插入一个新的倒塌(在 php 中)时,我们都需要取回最新插入的 ID。听起来可能很愚蠢。但是我们不是从 PHP 生成 ID,它来自一个通用的 AJAX 函数,因此我们不知道包含主键的变量的名称,它总是在变化。

有没有办法使用 PHP 或 MYSQL 来获取为不自动递增的主键插入的最新 ID?

很遗憾,如果没有 auto_increment,mysql_insert_id() 和 last_insert_id() 将无法工作。

谢谢!

【问题讨论】:

如果您的主键没有自动递增,那么您应该在插入之前已经知道它。 有一个created_on 列并获取最新的。 MAX() 仅在您确定数量正在增加时才有效,否则请参阅时间戳解决方案。 @Arman,这很明显。我希望 OP 能够响应“我不能使用 MAX() 因为它是非升序的,这里有更多信息……”或“当然,我将使用 MAX()”的效果。 :) MAX 是一个非首发,因为两个不同的请求几乎可以同时进行插入,并且您最终可能会得到错误的 id。 Plus max 需要一个操作员说他不知道的列名?这非常令人困惑。你怎么能在不知道你在插入什么的情况下进行插入?只是将一些日期扔到一些随机表中?如果您知道表名,那么您为什么不知道主键名?到底什么是倒塌? 【参考方案1】:

前往本页的 cmets 部分。 http://php.net/manual/en/function.mysql-insert-id.php 您应该会看到一些可能对您有用的方法。

我会尝试插入特定的时间戳,然后再次调用该时间戳插入。

戴夫在此评论中很好地解释了这一点。引用他的话..


这里有很多关于“不要使用 AI”和“使用最大值”的错误信息 是等效的”。然后你有人不恰当地建议你使用 伪随机数

如果你真的担心 AI 领域不会因为 固有的竞争条件,只需根据 vars 你刚刚输入。如果您的变量不是唯一的,请不要使用这些 伪随机数。当您有足够的迭代次数时, 这些随机数之一成为重复的概率得到 相当高。

相反,只需使用 unix 时间戳。但是,不要使用 UNIX_TIMESTAMP() 在你的查询中,因为如果你这样做,当你运行你的 select 语句之后,有可能你最终会 具有不同的时间戳。

由于 date() 在脚本执行期间继续计数, 只需将 date(U) 存储到变量或定义中。然后插入并 以此为基础进行选择。假设你没有使用 mysql 程序:

<?php

define(UNIX_TIMESTAMP, date('U'));

$db->query("insert into table values('', 'a', 'b', 'c', 'd', '".UNIX_TIMESTAMP."'");
$res = $db->query("select id from table where a_col = 'a' and b_col = 'b' and c_col = 'c' and d_col = 'd' and temp_id = 'UNIX_TIMESTAMP'");

//...

?>

【讨论】:

【参考方案2】:

以下 SQL 语句将获取最后插入的 PK id。 在您的插入语句之后执行此操作...

SELECT LAST_INSERT_ID() FROM tblName;

没错,我忘了你提到你的 PK 不是自动递增的。然后用时间戳解决方案查看答案。这是我知道你可以做到这一点的唯一方法。但最好有自动增量字段。也许您需要检查您的数据库方案。

【讨论】:

LAST_INSERT_ID() 仅适用于 auto_increment 列。 OP 说这不是一个 auto_increment 列。 编辑指向正确答案,谢谢@Marcus,我忘了他没有自动增量。

以上是关于如果我的主键不自动递增,如何使用 PHP 获取最后插入的 ID的主要内容,如果未能解决你的问题,请参考以下文章

phpmyadmin 自动递增主键行为奇怪

如何在各种 .NET ORM 中使列成为自动递增的主键?

如何在php中添加自动增量主键

如何将自动递增的主键也用作外键?

每个 MySQL 表都应该有一个自动递增的主键吗?

以编程方式获取自动增量主键列