首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有类似SQL Server的时间戳列的MySQL功能?

问是否有类似SQL Server的时间戳列的MySQL功能?
EN

Stack Overflow用户
提问于 2009-09-01 18:54:35
回答 2查看 4.3K关注 0票数 2

我的初步研究说“不”。

我在SQL Server中有一个数据库应用程序,它使用SQL Server时间戳列来跟踪更改...也就是说,我可以遍历该表,并知道如果我看到一个时间戳>而不是某个引用时间戳,则表示该行已被添加或更新。

我正在MySQL中寻找这样的类型。它似乎并不存在。那么,我是否必须使用触发器(好的)或应用程序逻辑(坏的)来复制此功能?

请注意,仅仅使用MySQL的时间戳并不是一个很好的解决方案,因为它并不总是唯一的,并且不会随着时间的推移而单调增加。

编辑-这是我多年来一直使用的场景...

我在OLTP系统中有一个表,它是库存的当前状态。我有一个前端GUI,它显示库存的不同视图。我想偶尔去问数据库“哪些行是新的/更改的”。使用SQL Server的TIMESTAMP/ROWVERSION,我可以很容易地做到这一点。如果我使用实际的date类型,我总是会遇到问题,我要么多次获得更新(不是巨大的灾难),要么偶尔错过一次更新(灾难)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-09-01 19:00:15

我不确定我是否理解为什么这不适用于您的场景。是否保证TIMESTAMP在MS SQL Server中是唯一的?

啊哈--我在SQL Server中看到时间戳是rowversion的同义词,它有点像MySQL的AUTO_INCREMENT,只是它在UPDATE和INSERT上生成一个新的单调递增的值。

不,MySQL没有这样的东西。MySQL也不支持SEQUENCE对象,如Oracle、PostgreSQL或IBM DB2。例如,序列将允许您从触发器生成新值。

我在你的问题中读到了你的更新信息,所以我理解你试图解决的问题。

我认为另一种解决方案是在您正在处理的表中添加另一个属性,称为is_processed或其他什么。插入新行时输入NULL。当您开始处理它时,将该列中的值更改为1。这样,您就可以知道还需要处理哪些行--它们将是is_processed IS NULL所在的行。

Re你的评论:好的,我看到问题了。每个用户都需要自己的视图来查看哪些行是新的/更改的。

我在MySQL中看到的另一个用来模拟序列对象的技巧是一个表,它只包含一个自动递增的主键。您可以通过插入到此表中生成新的唯一单调递增值,然后回滚插入操作。

代码语言:javascript
复制
CREATE TABLE sequence (id SERIAL) ENGINE=InnoDB; -- Must be InnoDB

START TRANSACTION;
INSERT INTO sequence () VALUES (); -- Yes this is a legal statement.
ROLLBACK;

SELECT LAST_INSERT_ID();

您不能在MySQL触发器中启动和回滚事务,因此必须在应用程序代码中生成新值。

或者,您可以切换到PostgreSQL,并获得对序列的真正支持。

票数 5
EN

Stack Overflow用户

发布于 2009-09-01 19:28:39

如果单调性问题是由于夏令时引起的,您可以在检查时间戳列时将时区设置为UTC:

代码语言:javascript
复制
SET time_zone = timezone;

或者,您可以使用触发器用UTC_TIMESTAMP填充DATETIME列。

不幸的是,这两个想法都不会强制唯一性,也不会阻止事务的竞争条件。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1364051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档