- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - phát hiện rò rỉ bộ nhớ Ruby/Ruby on Rails
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我在使用 Django 和 MySQL 5.5.22 时遇到以下问题。
给定一个包含列 id、level 和存储为 a11、a12、a21、a22 的 2x2 矩阵的表,我有这一行:
id a11 a12 a21 a22 level
324 3 2 5 3 2
给定一个查询集 qs,我进行以下更新:
qs.update(
a11=(b12 * a21 - b11 * a22) * F('a11') + (b11 * a12 - b12 * a11) * F('a21'),
a12=(b12 * a21 - b11 * a22) * F('a12') + (b11 * a12 - b12 * a11) * F('a22'),
a21=(b22 * a21 - b21 * a22) * F('a11') + (b21 * a12 - b22 * a11) * F('a21'),
a22=(b22 * a21 - b21 * a22) * F('a12') + (b21 * a12 - b22 * a11) * F('a22'),
level=(F('level') - 1)
)
django 为此生成以下查询(从 db.connection.queries 获取,为简洁起见删除 where 子句):
UPDATE `storage`
BỘ
`a21` = (3 * `storage`.`a11`) + (-1 * `storage`.`a21`),
`a22` = (3 * `storage`.`a12`) + (-1 * `storage`.`a22`),
`level` = `storage`.`level` - -1,
`a11` = (2 * `storage`.`a11`) + (-1 * `storage`.`a21`),
`a12` = (2 * `storage`.`a12`) + (-1 * `storage`.`a22`)
之后我的行看起来像这样:
id a11 a12 a21 a22 level
324 2 1 4 3 1
对于任何行,a12*a21 - a11*a22 = 1
应该为 True,据此,该行应该为:
id a11 a12 a21 a22 level
324 1 1 4 3 1
这是我在 SQLite 上得到的结果,Django 生成相同的查询,我花了很多时间才发现 MySQL 做了一些不同的事情。从查询来看,似乎在更新相互依赖的多行时,MySQL 不会将其视为单个原子操作,并且随着列的更新,它们会影响依赖于它们的值。我确认这似乎是 Python 提示符下的以下代码所发生的情况:
>>> a11, a12, a21, a22 = (3, 2, 5, 3)
>>> (2 * a11) + (-1 * a21),\
... (2 * a12) + (-1 * a22),\
... (3 * a11) + (-1 * a21),\
... (3 * a12) + (-1 * a22)
(1, 1, 4, 3)
如果按查询给定的相同顺序一次更新一个列:
>>> a11, a12, a21, a22 = (3, 2, 5, 3)
>>> a21 = (3*a11) + (-1*a21)
>>> a22 = (3*a12) + (-1*a22)
>>> a11 = (2*a11) + (-1*a21)
>>> a12 = (2*a12) + (-1*a22)
>>> (a11, a12, a21, a22)
(2, 1, 4, 3)
这真是可怕的行为,因为这是一个旨在跨平台使用的库。我的问题是:
biên tập
问题很明显,但我仍在寻找解决方案。提取所有值并将它们推回去对于这个特定的应用程序来说不是一个可接受的解决方案。
câu trả lời hay nhất
PostgreSQL、Oracle 和 SQL Server 都将此视为原子操作。 See the following SQL Fiddle, and switch the server to see the behavior of the following SQL :
CREATE TABLE Swap (
a CHAR(1),
b CHAR(1)
);
INSERT INTO Swap (a, b) VALUES ('a', 'b');
UPDATE Swap SET a = b, b = a;
SELECT * FROM Swap;
MySQL 是唯一在更新后两列都包含相同值的 RBDMS。
至于如何解决这个问题,我会改为从数据库中提取值,在应用程序内部进行计算(而不是更新语句),然后使用计算值更新数据库。这样您就可以保证以一致的方式执行计算。
关于MySQL更新更改多列是非原子的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10692884/
đóng cửa. Câu hỏi này không tuân thủ các nguyên tắc của Stack Overflow. Hiện tại nó không chấp nhận câu trả lời. Chúng tôi không cho phép các câu hỏi tìm kiếm đề xuất về sách, công cụ, thư viện phần mềm, v.v. Bạn có thể chỉnh sửa câu hỏi của mình để trả lời bằng sự kiện và trích dẫn. Đóng cửa 4 năm trước.
我已更改 my.cnf。并检查sql_mode使用下面的命令 select @@global.sql_mode; 它说, 我也尝试过 set global sql_mode=''; SET sql_m
首先,我有一个结构,它有一个值和一个默认值 struct S { int a = 1; }; 当 gcc 和 clang 都是 non-const/non-constexpr 时,可以默认构造
Tôi là một lập trình viên xuất sắc, rất giỏi!