मेरा मानना है कि एक मध्यवर्ती विनिमय चर इस तरह से सबसे अच्छा अभ्यास है:
update z set c1 = @c := c1, c1 = c2, c2 = @c
सबसे पहले, यह हमेशा काम करता है; दूसरा, यह डेटा प्रकार की परवाह किए बिना काम करता है।
दोनों के बावजूद
update z set c1 = c1 ^ c2, c2 = c1 ^ c2, c1 = c1 ^ c2
तथा
update z set c1 = c1 + c2, c2 = c1 - c2, c1 = c1 - c2
आमतौर पर काम कर रहे हैं, केवल संख्या डेटा प्रकार के लिए, और यह अतिप्रवाह को रोकने के लिए आपकी जिम्मेदारी है, आप हस्ताक्षर किए और अहस्ताक्षरित के बीच XOR का उपयोग नहीं कर सकते, आप ओवरफ्लो होने की संभावना के लिए राशि का उपयोग भी नहीं कर सकते।
तथा
update z set c1 = c2, c2 = @c where @c := c1
काम नहीं कर रहा है अगर c1 0 या NULL या शून्य लंबाई स्ट्रिंग या सिर्फ रिक्त स्थान है।
हमें इसे बदलने की जरूरत है
update z set c1 = c2, c2 = @c where if((@c := c1), true, true)
यहाँ स्क्रिप्ट है:
mysql> create table z (c1 int, c2 int)
-> ;
Query OK, 0 rows affected (0.02 sec)
mysql> insert into z values(0, 1), (-1, 1), (pow(2, 31) - 1, pow(2, 31) - 2)
-> ;
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from z;
+------------+------------+
| c1 | c2 |
+------------+------------+
| 0 | 1 |
| -1 | 1 |
| 2147483647 | 2147483646 |
+------------+------------+
3 rows in set (0.02 sec)
mysql> update z set c1 = c1 ^ c2, c2 = c1 ^ c2, c1 = c1 ^ c2;
ERROR 1264 (22003): Out of range value for column 'c1' at row 2
mysql> update z set c1 = c1 + c2, c2 = c1 - c2, c1 = c1 - c2;
ERROR 1264 (22003): Out of range value for column 'c1' at row 3
mysql> select * from z;
+------------+------------+
| c1 | c2 |
+------------+------------+
| 0 | 1 |
| 1 | -1 |
| 2147483646 | 2147483647 |
+------------+------------+
3 rows in set (0.02 sec)
mysql> update z set c1 = c2, c2 = @c where @c := c1;
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2 Changed: 2 Warnings: 0
mysql> select * from z;
+------------+------------+
| c1 | c2 |
+------------+------------+
| 0 | 1 |
| -1 | 1 |
| 2147483647 | 2147483646 |
+------------+------------+
3 rows in set (0.00 sec)
mysql> select * from z;
+------------+------------+
| c1 | c2 |
+------------+------------+
| 1 | 0 |
| 1 | -1 |
| 2147483646 | 2147483647 |
+------------+------------+
3 rows in set (0.00 sec)
mysql> update z set c1 = @c := c1, c1 = c2, c2 = @c;
Query OK, 3 rows affected (0.02 sec)
Rows matched: 3 Changed: 3 Warnings: 0
mysql> select * from z;
+------------+------------+
| c1 | c2 |
+------------+------------+
| 0 | 1 |
| -1 | 1 |
| 2147483647 | 2147483646 |
+------------+------------+
3 rows in set (0.00 sec)
mysql>update z set c1 = c2, c2 = @c where if((@c := c1), true, true);
Query OK, 3 rows affected (0.02 sec)
Rows matched: 3 Changed: 3 Warnings: 0
mysql> select * from z;
+------------+------------+
| c1 | c2 |
+------------+------------+
| 1 | 0 |
| 1 | -1 |
| 2147483646 | 2147483647 |
+------------+------------+
3 rows in set (0.00 sec)
UPDATE table SET X = Y, Y = X
यह SQL में करने का मानक तरीका है, केवल MySQL दुर्व्यवहार करता है।