मुझे बस उसी से निपटना था और मैं अपने निष्कर्षों को संक्षेप में बताऊंगा।
-
UPDATE table SET X=Y, Y=X
दृष्टिकोण स्पष्ट रूप से काम नहीं करता है, क्योंकि यह दोनों मानों को Y पर सेट कर देगा। -
यहां एक विधि है जो अस्थायी चर का उपयोग करती है। http://beerpla की टिप्पणियों से एंटनी को धन्यवाद। .net/2009/02/17/swapping-column-values-in-mysql/ "IS NOT NULL" ट्वीक के लिए। इसके बिना, क्वेरी अप्रत्याशित रूप से काम करती है। पोस्ट के अंत में टेबल स्कीमा देखें। यदि उनमें से एक NULL है तो यह विधि मानों को स्वैप नहीं करती है। विधि #3 का उपयोग करें जिसमें यह सीमा नहीं है।
UPDATE swap_test SET x=y, [email protected] WHERE (@temp:=x) IS NOT NULL;
-
यह विधि दीपिन द्वारा एक बार फिर http://beerla.net/2009/02/17/swapping-column-values-in-mysql/ . मुझे लगता है कि यह सबसे सुंदर और साफ समाधान है। यह NULL और non-NULL दोनों मानों के साथ काम करता है।
UPDATE swap_test SET x=(@temp:=x), x = y, y = @temp;
-
एक और तरीका जिसके साथ मैं आया वह काम करता प्रतीत होता है:
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);