我的初步研究说"不".
我在SQL Server中有一个数据库应用程序,它使用SQL Server时间戳列来跟踪更改....也就是说,我可以通过表格知道如果我看到时间戳>某个参考时间戳,那么该行已经添加或更新.
我正在寻找类似MySQL的类型.它似乎不存在.那么,我是否必须使用触发器(好)或应用程序逻辑(坏)来复制此功能?
请注意,仅使用MySQL的TIMESTAMP并不是一个很好的解决方案,因为它并不总是唯一的,并且不会随着时间的推移而单调增加.
编辑---这是我多年来一直使用这些的场景......
我在OLTP系统中有一个表,它是库存的当前状态.我有一个前端GUI,显示库存的不同视图.我偶尔会去询问数据库"哪些行是新的/已更改".使用SQL Server的TIMESTAMP/ROWVERSION,我可以轻松地做到这一点.如果我使用实际的日期类型,我会遇到问题,我要么不止一次获得更新(不是一场大灾难),或偶尔错过更新(灾难).
我不确定我理解为什么这对你的场景不起作用.被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,并获得对序列的真正支持.
| 归档时间: |
|
| 查看次数: |
3534 次 |
| 最近记录: |