是否有像SQL Server TIMESTAMP列这样的MySQL功能?

时间:2009-09-01 18:54:35

标签: mysql

我的初步研究表明“不”。

我在SQL Server中有一个数据库应用程序,它使用SQL Server时间戳列来跟踪更改....也就是说,我可以通过表格知道如果我看到时间戳>比某些参考时间戳更新了该行。

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

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

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

我在OLTP系统中有一个表,它是库存的当前状态。我有一个前端GUI,显示库存的不同视图。我偶尔会去询问数据库“哪些行是新的/已更改”。使用SQL Server的TIMESTAMP / ROWVERSION,我可以轻松地做到这一点。如果我使用实际的日期类型,我总会遇到问题,我不止一次更新(不是一场大灾难),或偶尔错过更新(灾难)。

2 个答案:

答案 0 :(得分:5)

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

啊哈 - 我在SQL Server中看到时间戳是rowversion的同义词,它有点像MySQL的AUTO_INCREMENT,除了它在UPDATE以及之后生成一个新的单调递增值INSERT

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


我在您的问题中阅读了您的最新信息,因此我了解您要解决的问题。

我所看到的另一种解决方案是在您正在处理的表格中添加另一个属性,将其称为is_processed或其他内容。插入新行时输入NULL。当您处理它时,将该列中的值更改为1.然后,您将始终知道尚未处理哪些行 - 它们将是is_processed IS NULL的行。


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

我在MySQL中用来模拟序列对象的另一个hack是一个包含自动增量主键的表而不是其他任何东西。您可以通过插入此表生成新的唯一单调递增值,然后回滚插入。

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,并获得对序列的真正支持。

答案 1 :(得分:-1)

如果单调性问题是由夏令时造成的, 您可以在检查TIMESTAMP列时将时区设置为UTC:

SET time_zone = timezone;

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

不幸的是,这两种想法都没有强制执行唯一性,也不会阻止交易中的竞争条件。