如何确保在 MySQL 上同时对 2 个表进行相等更新
How to assure equal update on 2 tables simultaneously on MySQL
我有一个我无法解决的问题。我试图用相同的数据更新 2 个不同的表,但我总是以差异结束
我有 2 个表:users
和 stats
users
结构:
id: int(25)
balance: decimal(18,6)
和stats
结构:
date: date
userid: int(25)
balance: decimal(18,6)
我正在使用 innodb 事务来更新表,如下所示:
mysql_query("BEGIN TRANSACTION");
$result1 = mysql_query("INSERT INTO users(id, balance)
VALUES ".$balance."
ON DUPLICATE KEY UPDATE balance = balance + VALUES(balance)");
$result2 = mysql_query("INSERT INTO pubday (date, userid, balance)
VALUES ".$balance."
ON DUPLICATE KEY UPDATE balance=balence+VALUES(balance)");
if($result1 === false || $result2 === false) {
mysql_query("ROLLBACK");
}else{
mysql_query("COMMIT");
}
我每天至少更新表格 500 万次。不管怎样,我总是从 users
和 stats
的余额中得到一个微小的差异,这个查询:
SELECT sum(balance) from stats
和
SELECT balance from users
例如,我在统计数据上得到 balance=302.001731,在用户上得到 balance=302.194501。应该是一样的。
我的问题是这里的错误是什么或者我做错了什么?或者解决这个问题的最佳方法是什么?用相同的数据同时更新 2 个表。
答案很简单:不要拥有多个权限点。如果两列应该相同,使它们成为同一列。我会这样做是删除 stats.balance
,并在需要时通过 SQL.
即时计算统计数据
毕竟,临时查询是 1970 年代最初研究关系数据库管理系统 (RDBMS) 的核心原因之一。
与此同时,您似乎想要某种 "Materialized View" 以便显示过去的数据。如果是这种情况,请考虑暂时保存 each 事务,然后根据 SQL 计算定期插入统计信息 table。类似于:
INSERT INTO stats (date, userid, balance)
SELECT CURDATE(), id, SUM(balance) FROM users GROUP BY 1, 2;
并且可能,根据您的需要,通过 ON DUPLICATE KEY UPDATE
使用 UPSERT。
显然,SUM(balance)
不完整或不正确,但求和的想法是重点,在您更新架构后。
我有一个我无法解决的问题。我试图用相同的数据更新 2 个不同的表,但我总是以差异结束
我有 2 个表:users
和 stats
users
结构:
id: int(25)
balance: decimal(18,6)
和stats
结构:
date: date
userid: int(25)
balance: decimal(18,6)
我正在使用 innodb 事务来更新表,如下所示:
mysql_query("BEGIN TRANSACTION");
$result1 = mysql_query("INSERT INTO users(id, balance)
VALUES ".$balance."
ON DUPLICATE KEY UPDATE balance = balance + VALUES(balance)");
$result2 = mysql_query("INSERT INTO pubday (date, userid, balance)
VALUES ".$balance."
ON DUPLICATE KEY UPDATE balance=balence+VALUES(balance)");
if($result1 === false || $result2 === false) {
mysql_query("ROLLBACK");
}else{
mysql_query("COMMIT");
}
我每天至少更新表格 500 万次。不管怎样,我总是从 users
和 stats
的余额中得到一个微小的差异,这个查询:
SELECT sum(balance) from stats
和
SELECT balance from users
例如,我在统计数据上得到 balance=302.001731,在用户上得到 balance=302.194501。应该是一样的。
我的问题是这里的错误是什么或者我做错了什么?或者解决这个问题的最佳方法是什么?用相同的数据同时更新 2 个表。
答案很简单:不要拥有多个权限点。如果两列应该相同,使它们成为同一列。我会这样做是删除 stats.balance
,并在需要时通过 SQL.
毕竟,临时查询是 1970 年代最初研究关系数据库管理系统 (RDBMS) 的核心原因之一。
与此同时,您似乎想要某种 "Materialized View" 以便显示过去的数据。如果是这种情况,请考虑暂时保存 each 事务,然后根据 SQL 计算定期插入统计信息 table。类似于:
INSERT INTO stats (date, userid, balance)
SELECT CURDATE(), id, SUM(balance) FROM users GROUP BY 1, 2;
并且可能,根据您的需要,通过 ON DUPLICATE KEY UPDATE
使用 UPSERT。
显然,SUM(balance)
不完整或不正确,但求和的想法是重点,在您更新架构后。