আমি বিশ্বাস করি একটি মধ্যবর্তী এক্সচেঞ্জ ভেরিয়েবল এমনভাবে সেরা অনুশীলন:
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
সাধারণত উপায় হিসাবে কেবল সংখ্যা টাইপ টাইপের জন্য কাজ করে থাকেন, এবং ওভারফ্লো প্রতিরোধ করা আপনার দায়িত্ব, আপনি স্বাক্ষরিত এবং স্বাক্ষরবিহীনদের মধ্যে এক্সওআর ব্যবহার করতে পারবেন না, আপনি অতিরিক্ত প্রবাহের সম্ভাবনার জন্য যোগফলও ব্যবহার করতে পারবেন না।
এবং
update z set c1 = c2, c2 = @c where @c := c1
সি 1 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এসকিউএল এ করার মানক উপায়, শুধুমাত্র মাইএসকিউএল খারাপ ব্যবহার করে।