मेरा मानना है कि एक मध्यवर्ती विनिमय चर इस तरह से सबसे अच्छा अभ्यास है:
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 या शून्य या शून्य लंबाई स्ट्रिंग या सिर्फ रिक्त स्थान है। (संग्रहण) की तरह और रीसेट
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)
नोट के रूप में, 'अद्यतन तालिका सेट एक्स = वाई, वाई = एक्स' एसक्यूएल में इसे करने का मानक तरीका है, केवल MySQL misbehaves। –