是否有等效于 LAST_INSERT_ID 的时间戳?

Posted

技术标签:

【中文标题】是否有等效于 LAST_INSERT_ID 的时间戳?【英文标题】:Is there an equivalent to LAST_INSERT_ID for timestamps? 【发布时间】:2017-09-11 14:34:30 【问题描述】:

我喜欢 mysql 的 LAST_INSERT_ID() 函数。我一直使用它来检索刚刚插入的行的 id,然后从我的存储过程中返回。但是,现在我有一个表,它的主键 TIMESTAMP 设置为 DEFAULT CURRENT_TIMESTAMP。如何检索最后插入的时间戳

【问题讨论】:

如果并发插入产生相同的 CURRENT_TIMESTAMP 会发生什么?你确定它是你PK的好选择吗? @AlexK。 OP 可能在时间戳上使用毫秒精度,但它仍然很有可能发生冲突。不是一个好的选择,因为插入会经常失败,需要重新执行。 虽然我大体上同意@BillKarwin,但偶尔会出现时间确实是(或属于)自然标识符的情况,而且我也想利用唯一约束将错误返回到任何尝试的应用程序或 SProc。 “这是一项功能!” @ChristopherMcGowan,是的,如果设计的一部分不应该有超过一行具有相同的时间戳,那没关系。 【参考方案1】:

这应该是安全的:

START TRANSACTION;
do your insert;
SELECT MAX(timestamp field) FROM table;
COMMIT;

【讨论】:

虽然我提供了另一种选择,但我实际上更喜欢您在交易中这样做的方式,因为这是几个月内其他人(和我自己)最直接的阅读方式:-P。 【参考方案2】:

另一种方法是利用该函数的LAST_INSERT_ID(expr) 版本,它实际上可以将值设置为您喜欢的任何整数(可能是时间戳的 UNIX_TIMESTAMP 整数?):

INSERT INTO my_tbl SET the_ts = FROM_UNIXTIME(LAST_INSERT_ID(UNIX_TIMESTAMP()));

现在你可以:

SELECT FROM_UNIXTIME(LAST_INSERT_ID());

与 Jon Harmon 提供的事务解决方案一样,该解决方案的一个缺点是必须考虑到这一点(使用相同的值显式覆盖列的默认值,或启动事务)。代码可读性降低了一点,它可能会使希望使用此表的其他人感到困惑。我认为 Jon 的解决方案在保持可读性方面做得更好。

另外,请记住,如果您在触发器中执行此操作,triggers swallow last_insert_id() value changes.

但是,如果确实需要,您可以使用会话变量将其从触发器中冒泡出来。


试试这个设置LAST_INSERT_ID的例子:

SELECT FROM_UNIXTIME(LAST_INSERT_ID(UNIX_TIMESTAMP()));
SELECT FROM_UNIXTIME(LAST_INSERT_ID());

【讨论】:

不错的选择!谢谢!【参考方案3】:

在时间戳字段上使用MAX 方法。

【讨论】:

但这不像 LAST_INSERT_ID 那样是并发安全的吗?因为这就是为什么我们不对 id 字段使用 MAX 方法来获取 id。 @SimonBaars:如果您使用可重复读取事务隔离,您的事务将看不到自事务开始以来并发客户端插入的任何行。您必须仔细检查错误,因为如果您的 INSERT 失败,那么 MAX() 将返回一个值,而您认为它不应该。 FWIW,我不会使用时间戳作为主键,因为冲突的可能性太大。 @SimonBaars 我认为LAST_INSERT_ID 做同样的事情并返回 MAX id @DeepanshSachdeva,LAST_INSERT_ID() 不返回 MAX id。它返回由插入当前会话生成的最新ID。如果其他并发客户端随后生成更大的 id 值,您的会话仍将返回您的会话生成的 id。您可以通过在终端窗口中并排打开两个会话并在每个窗口中插入并选择 last_insert_id() 来证明这一点。 @BillKarwin 哦!感谢您提供正确的信息:)

以上是关于是否有等效于 LAST_INSERT_ID 的时间戳?的主要内容,如果未能解决你的问题,请参考以下文章

是否有 -moz 等效于 ::-webkit-scrollbar? [复制]

是否有 R 等效于 python 的字符串“格式”函数?

是否有等效于 HTML 电子邮件的 CSS 最大宽度?

是否可以从不同的数据库中获取 LAST_INSERT_ID() ?

是否有一个等效的 REST API 函数来获取 Paypal 帐户的余额,类似于 NVP 获取余额 API? [关闭]

是否有 Python 等效于正则表达式的 Perl "/x" 修饰符?