当前位置: 首页 > 面试题库 >

进行SELECT MAX(id)等以查找最后插入的行在概念上是否正确?

阎作人
2023-03-14
问题内容

当我发现此模式以获取上次插入的行的ID时,我正在查看Drupal模块:

SELECT MAX(id) FROM ... WHERE ...

其中的id是按通常的自动递增方式工作的字段。

这在概念上是正确的吗?在MySQL / PostgreSQL环境中这种模式是否会失败?

编辑:

感谢您的出色评论和回答!

我应该澄清一下我的问题:我的意思是, 无论会话如何 ,有人都希望找出最后插入的行的ID 。


问题答案:

这似乎是主观的,但我会说不,这在概念上是不正确的,因为:

  • 您想要最近插入的行
  • 但您的查询似乎在最高id

是的,最大ID与最新插入之间存在某种关系,但请考虑以下因素:

  • 如果删除了最近插入的行怎么办?

在MySQL上回答:您得到不同的结果。请注意,甚至不必使用多线程或多个进程即可使此操作失败。那是因为它们是两种不同的东西
(诚​​然,它们通常可以产生相同的结果)。

select max(id) from <tablename>

select last_insert_id()

(猜猜哪个是对的。)

@Dems指出OP含糊不清。我将阐明我的主要观点:

我们正在谈论三种不同的信息:

  • 最高id
  • id 最近插入的行数,特定于会话
  • id 最近插入到表中的行数(与会话无关)

危险的事情是,有时查询一个会为另一个提供正确的答案- 但并非总是如此



 类似资料:
  • 问题内容: 在iPhone上,使用FMDB获取SQLite数据库中最后插入的行的ID的最佳方法是什么? 有没有比做更好的方法: 问题答案: 如果可以保证您的列是自动递增的列,那很好。 但不管怎样,有一个专门的SQLite函数称为: 在FMDB中,您使用方法(在内部运行上述方法):

  • 问题内容: 我想返回当前插入的AUTO_INCREMENT值,并在msgbox中显示。 问题答案: 您可以使用双重查询并使用函数LAST_INSERT_ID()在运行第一个查询以获取最新的当前查询之后:

  • 问题内容: 我正在使用PHP中的mvc结构,我想检索最后插入的行ID。 我创建了以下sql代码: 但不幸的是我遇到了这个错误: 我也尝试过此堆栈链接,但不适用于我,因此如果您能帮助我获取ID,我将非常高兴。 我也在这里共享我的controller.php文件。 问题答案: 你快到了。 如果您查看lastInsertId的手册页,则会在数据库句柄上调用它- 您当前正在语句中对其进行调用。 您只需要致

  • 问题内容: 我有一个关于学校作业的问题,我需要用Java来完成。我需要从文件加载数据并检查这些文件中的错误。 我读取带有的文件,该文件在文件末尾之前都可以正常运行:如果该行为空,它将忽略最后一行。 我知道如何检查空行,但是使用的功能,最后一行根本不会给出任何结果。 重要的是,我知道最后一行是否必须为空。如果空行不存在,则应该给出错误。 长话短说,我需要一种方法来说明以下情况(行尾在哪里)之间的区别

  • 我有两个目标 使用以下映射文件 当我保存一个包含一个子项的父项时,生成的sql如下所示 Hibernate:插入到父(id,名称)值中(null,?) Hibernate:插入子(id、父id、名称)值(null、、?) Hibernate:更新子集父\u id=?其中id=? 似乎当hibernate插入孩子时,它会将parent_id设置为空,然后进行更新。这在我的数据库和Hibernate验

  • 在postgresql 9.5中,如何插入。。。在冲突(id)上进行更新。。。语法是否可以与序列ID一起使用? 在具有以下列的表中: tbltest_ID 其中,在数据库中有一个自动递增的序列。 以下内容适用于更新,例如:;正在更新ID为4的记录: 但是为了让DB为插入创建序列ID,我需要从语句中删除ID列: 如果我想更新多个记录(一些新记录和一些现有记录),这就成了一个问题。就好像我删除了ID列