我有一个Web应用程序,用户可以同时更改数据。目前,我在每个表单中包含旧行值,并且仅在数据相同时才更新行。使用SQLite这是唯一的选择。这很难看,如果能提供更好的方法,我会考虑切换到另一个SQL数据库。 PostgreSQL或MySQL是否有隐含的行时间戳或版本号,而不是可以使用?
答案 0 :(得分:3)
使用数字计数器比使用时间戳更好。无论时间戳如何精确,都可以同时提交两个版本的数据并获得相同的时间戳。通过使用数字计数器(例如update mytable set counter=counter+1, data=? where id=? and counter=?
),每次行变化时,它获得唯一的计数器值。 (在where子句中提供原始计数器值,如果数据已由其他人更改,则不会匹配任何行。)
虽然这不是一个“隐含”的解决方案,但我认为没关系。像Hibernate这样的库可以让你自动完成这类工作,所以你的代码不必担心它。
答案 1 :(得分:2)
MySQL与TIMESTAMP
和DEFAULT CURRENT_TIMESTAMP
约束相结合时,ON UPDATE CURRENT_TIMESTAMP
数据类型为can be used for this purpose。
在PostgreSQL中,每个名为xmin
的表都有一个“隐藏字段”,可用于确定行版本。
答案 2 :(得分:0)
AFAIK,在Postgres中获取更新时间戳需要触发器,请看这个非常相似的问题:
Update timestamp when row is updated in PostgreSQL
这个问题(和Eric的回答)指出MySQL支持这个没有触发器。