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

Eri*_* H. 2 mysql

我的初步研究说"不".

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

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

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

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

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

Bil*_*win 5

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

Aha - 我在SQL Server中看到时间戳是rowversion的同义词,有点像MySQL,AUTO_INCREMENT除了它产生一个新的单调增加值UPDATE以及on INSERT.

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


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

我所看到的替代解决方案是在您正在处理的表中添加另一个属性,调用它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();
Run Code Online (Sandbox Code Playgroud)

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

否则你可以切换到PostgreSQL,并获得对序列的真正支持.