如果您使用的是正確的符合標準的SQL數據庫,這應該可以正常工作。查詢將擴大到
UPDATE car SET x = y, y = x WHERE <filter>
這將至少在PostgreSQL(下文)正常工作,sqlite3的(如下圖),Oracle和MSSQL,但MySQL的實現是壞了。
的PostgreSQL:
select * from car;
x | y
---------+------
prefect | ford
(1 row)
test=> update car set x = y, y = x;
UPDATE 1
test=> select * from car;
x | y
------+---------
ford | prefect
(1 row)
的SQLite3
sqlite> select * from foo;
prefect|ford
sqlite> update foo set x = y, y = x;
sqlite> select * from foo;
ford|prefect
然而,MySQL的違反SQL標準,
mysql> insert into car values ('prefect', 'ford');
Query OK, 1 row affected (0.01 sec)
mysql> select * from car;
+---------+------+
| x | y |
+---------+------+
| prefect | ford |
+---------+------+
1 row in set (0.00 sec)
mysql> update car set x = y, y = x;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from car;
+------+------+
| x | y |
+------+------+
| ford | ford |
+------+------+
1 row in set (0.00 sec)
因此,有一個可移植的方式來做到這一點使用符合標準的, SQL數據庫,但MySQL不是其中之一。如果您不能使用for
... save
循環,那麼您必須使用Swapping column vales in MySQL中的一些黑客;臨時變量似乎是最通用的變量;儘管我不確定是否可以使用Django的F
構造的臨時變量。
這是SQL行爲的方式。例如'UPDATE myapp_car set x = y,y = x'會將它們都設置爲y – e4c5
@ e4c5不,它不會。這只是** MySQL **被破壞了,也許這就是你和Tomas正在使用的。 –
那麼,我確實有三個RDBMS,但不幸的是,我對這個只有一個mysql,應該也試過postgresql @AnttiHaapala – e4c5