標準に準拠した適切な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はその1つではありません。 for
... ループを使用できない場合は、Swapping column vales in MySQLからいくつかのハックに頼る必要があります。一時変数は最も一般的な変数のようです。私はあなたがDjangoのF
構造体で一時変数を使用できるかどうかはわかりませんが。
これは、SQLが動作する方法です。たとえば、 'UPDATE myapp_car set x = y、y = x'はy – e4c5
@ e4c5の両方に設定されます。 ** MySQL **は壊れており、おそらくあなたとTomasが使用しているものです。 –
さて、私は3つのRDBMSを持っていますが、残念なことに私はこれを唯一のmysqlを試してみました。また、postgresql @ AnttiHaapala – e4c5