在不改變表結構的情況下交換MySQL 中的列值
正如您所提到的,使用UPDATE 透過簡單的SET X=Y 來交換列值,Y=X 將不會產生所需的結果。但是,您可以考慮多種替代方法,具體取決於您的資料和權限限制。
方法 1:帶有 IS NOT NULL 檢查的臨時變數
此方法採用臨時變量,用於在與另一列交換時保存一列的值。但是,它僅在兩個值都非 NULL 時才有效。
UPDATE swap_test SET x=y, y=@temp WHERE (@temp:=x) IS NOT NULL;
方法2:不含IS NOT NULL 檢查的臨時變數
一種更通用的方法,可以處理NULL 和非NULL 值:
UPDATE swap_test SET x=(@temp:=x), x = y, y = @temp;
方法3:雙表更新
另一種方法涉及使用第二個表來交換值。這需要存在主鍵:
UPDATE swap_test s1, swap_test s2 SET s1.x=s1.y, s1.y=s2.x WHERE s1.id=s2.id;
測試範例
使用提供的測試架構:
CREATE TABLE `swap_test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `x` varchar(255) DEFAULT NULL, `y` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB; INSERT INTO `swap_test` VALUES ('1', 'a', '10'); INSERT INTO `swap_test` VALUES ('2', NULL, '20'); INSERT INTO `swap_test` VALUES ('3', 'c', NULL);
應用方法2應該成功交換值:
UPDATE swap_test SET x=(@temp:=x), x = y, y = @temp;
輸出:
id x y 1 10 a 2 20 NULL 3 NULL c
以上是如何在不改變表結構的情況下有效率地交換MySQL中的列值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!