नहीं. (ऐसा कोई नहीं जिसके बारे में मैं सोच सकता हूं)।
समस्या यह है कि MySQL कैसे अपडेट की प्रक्रिया करता है। MySQL (अन्य DBMS के साथ अंतर जो UPDATE
implement को लागू करता है ठीक से), अद्यतनों को टूटे हुए तरीके से संसाधित करता है। यह UNIQUE
. की जांच को लागू करता है (और अन्य) हर एक पंक्ति अद्यतन के बाद बाधाएं और नहीं - जैसा कि इसे करना चाहिए - पूरे UPDATE
के बाद बयान पूरा करता है। इसलिए आपको (अधिकांश) अन्य DBMS के साथ यह समस्या नहीं है।
कुछ अपडेट के लिए (जैसे सभी या कुछ आईडी बढ़ाना, id=id+1
), इसका उपयोग करके हल किया जा सकता है - एक अन्य गैर-मानक सुविधा - एक ORDER BY
अपडेट में।
दो पंक्तियों से मानों की अदला-बदली के लिए, वह चाल मदद नहीं कर सकती। आपको NULL
का उपयोग करना होगा या एक फर्जी मान (जो मौजूद नहीं है लेकिन आपके कॉलम में अनुमत है) और 2 या 3 स्टेटमेंट।
आप अद्वितीय बाधा को अस्थायी रूप से हटा भी सकते हैं लेकिन मुझे नहीं लगता कि यह वास्तव में एक अच्छा विचार है।
इसलिए, यदि अद्वितीय कॉलम एक हस्ताक्षरित पूर्णांक है और कोई ऋणात्मक मान नहीं है, तो आप लेन-देन में लिपटे हुए 2 कथनों का उपयोग कर सकते हैं:
START TRANSACTION ;
UPDATE tasks
SET priority =
CASE
WHEN priority = 2 THEN -3
WHEN priority = 3 THEN -2
END
WHERE priority IN (2,3) ;
UPDATE tasks
SET priority = - priority
WHERE priority IN (-2,-3) ;
COMMIT ;