我有一个 Web 应用程序,用户可以在其中同时更改数据。目前,我在每个表单中都包含旧行值,并且只有在数据相同时才更新行。使用 SQLite,这是唯一的选择。这很难看,如果它可以提供更好的方法,我会考虑切换到另一个 SQL 数据库。PostgreSQL 或 MySQL 是否有隐含的行时间戳或版本号可以用来代替?
user141335
问问题
951 次
3 回答
3
使用数字计数器比使用时间戳更好。无论时间戳多么精确,有可能同时提交两个版本的数据并获得相同的时间戳。通过使用数字计数器(例如update mytable set counter=counter+1, data=? where id=? and counter=?
),每次更改行时都会获得唯一的计数器值。(在 where 子句中提供原始计数器值,如果数据已被其他人更改,则不会匹配任何行。)
尽管这不是“隐式”解决方案,但我认为还可以。诸如 Hibernate 之类的库可以让您自动执行此类操作,因此您的代码不必担心它。
于 2011-01-31T18:10:06.830 回答
2
当与和约束结合使用时, MySQL 具有可用于此目的TIMESTAMP
的数据类型。DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP
在 PostgreSQL 中,每个被调用的表上都有一个“隐藏字段” xmin
,可用于确定行版本。
于 2011-01-31T18:02:09.533 回答
0
AFAIK,在 Postgres 中获取更新时间戳需要一个触发器,请参阅这个非常相似的问题:
该问题(以及 Eric 的回答)指出 MySQL 支持这种 w/oa 触发器。
于 2011-01-31T18:03:15.080 回答