回答

收藏

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

技术问答 技术问答 206 人阅读 | 0 人回复 | 2023-09-14

当我发现此模式以获取上次插入的行的ID时,我正在查看Drupal模块:
  r$ x  Q; G# y8 ^  TSELECT MAX(id) FROM ... WHERE ...
! n/ @: J  M' H& V7 f# w其中的id是按通常的自动递增方式工作的字段。
2 G0 T& `$ A, T8 r  t# g( h这在概念上是正确的吗?在MySQL / PostgreSQL环境中这种模式是否会失败?
/ K/ i. @0 A( D编辑:% T, X) |  u" B% F
感谢您的出色评论和回答!
9 K; g& o& f5 w% |9 m! A* o我应该澄清一下我的问题:我的意思是, 无论会话如何 ,有人都希望找出最后插入的行的ID 。
( }' @( Y) A+ Q& f  @# \                ( g0 ?+ m7 \: l& M6 s; g" d3 m7 e5 N
解决方案:
/ E8 @, K. Z, \                1 R4 g: `/ X4 B

- }  C' }2 M7 L5 C8 g
7 k, e8 X( c2 x/ u0 o                这似乎是主观的,但我会说不,这在概念上是不正确的,因为:
0 e* ~/ [0 f$ ?. ^7 B3 b您想要最近插入的行3 C5 u7 p6 Z1 S9 o3 s# x% G! s
但您的查询似乎在最高id值
' m$ s) I% m: s) ~  Y3 W: A; s

2 S$ H; Q4 ?, Z0 N5 r( `是的,最大ID与最新插入之间存在某种关系,但请考虑以下因素:! [! f9 g1 Y+ Q. k5 I9 @
如果删除了最近插入的行怎么办? 5 `: T/ w& }" ]6 o
) t/ f* i' T8 R' s: V: p* C% U
在MySQL上回答:您得到不同的结果。请注意,甚至不必使用多线程或多个进程即可使此操作失败。那是因为它们是两种不同的东西
9 j4 R  |3 F% X+ E(诚??然,它们通常可以产生相同的结果)。
2 H) B' E8 L* e" m8 ?% x7 ~, C3 zselect max(id) from [table]9 m7 A* Q1 Z8 |, S+ ^

% N2 h" p  U  g; h# y% Bselect last_insert_id()" k+ O. m# ]+ x  p
(猜猜哪个是对的。)3 J6 k. B- D! s8 v
9 _* g. ^8 `$ u! s- f5 G
@Dems指出OP含糊不清。我将阐明我的主要观点:. \! V! b( m, c
我们正在谈论三种不同的信息:6 K) X4 v8 ]3 ~1 H
最高id值7 t2 ^0 T: a" Y2 @  H8 t
id 最近插入的行数,特定于会话
- W+ ~/ q/ R. Q6 {# C! O3 Rid 最近插入到表中的行数(与会话无关), t$ D) ^. q* f4 k8 A, v2 h+ N

& ^, f8 L3 h$ V7 f5 s7 a危险的事情是,有时查询一个会为另一个提供正确的答案- 但并非总是如此
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则