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

是否有类似SQL Server的MySQL功能';时间戳列?,mysql,Mysql,我的初步研究表明“不” 我在SQL Server中有一个数据库应用程序,它使用SQL Server时间戳列跟踪更改。。。。也就是说,我可以遍历该表,并知道如果我看到一个时间戳>而不是某个参考时间戳,那么该行已被添加或更新 我正在MySQL中寻找这样的类型。它似乎不存在。那么,我必须使用触发器(好)或应用程序逻辑(坏)来复制此功能吗 请注意,仅仅使用MySQL的时间戳并不是一个很好的解决方案,因为它并不总是唯一的,也不是随时间单调增加的 编辑---这是我多年来一直在使用的场景 我在OLTP系统中有

我的初步研究表明“不”

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

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

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

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


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

我不太明白为什么这不适用于您的场景。
时间戳在MS SQL Server中是否保证唯一

啊哈——我在SQL Server中看到,timestamp是一个同义词,它有点像MySQL的
自动增量
,只是它在
更新
插入
时生成一个新的单调递增值

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


我在你的问题中阅读了你的更新信息,因此我理解你试图解决的问题


我看到的另一种解决方案是在正在处理的表中添加另一个属性,称之为
is\u processed
或其他什么。插入新行时输入空值。当您着手处理它时,将该列中的值更改为1。然后,您将始终知道哪些行尚未处理—它们将是
被处理的行\u处理为NULL的行


你的评论是:好吧,我明白问题所在。每个用户都需要自己查看哪些行是新的/更改的

我在MySQL中看到的另一个用来模拟序列对象的黑客是一个表,它包含一个自动递增的主键,没有其他内容。通过插入此表,可以生成新的唯一单调递增值,然后回滚插入

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

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

SET time_zone = timezone;
或者,您可以使用触发器用UTC_时间戳填充DATETIME列


不幸的是,idea既不强制唯一性,也不会阻止事务的竞争条件。

“我认为另一种解决方案是在正在处理的表中添加另一个属性,称之为“已处理”或其他什么。”这不起作用。。。。假设只有一个表,但有许多GUI用户,您可以在mysql中模拟一个序列,如下所示。您可以在更新前/插入前触发器中使用它来更新必须添加到表中的自定义版本列。(是的,这是非常非常痛苦的)是的,这种解决方案对于并发性来说非常糟糕,因为MyISAM在更新期间执行表锁定。MySQL似乎没有很好的解决方案。您需要MyISAM表吗?InnoDB更适合于that@nos:该论坛链接中的解决方案依赖于MyISAM,因为它不受事务隔离的约束。如果在一个
update
语句中更新多行,我想也存在唯一性问题。对于由同一语句更新的所有行,更新的时间戳是相同的。不保证timestamp/rowversion是唯一的。如果您尝试使用select插入多行,则可以复制它