Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

कैसे अद्वितीय बाधा का उल्लंघन किए बिना MySQL में दो पंक्तियों के मूल्यों को स्वैप करने के लिए?

नहीं. (ऐसा कोई नहीं जिसके बारे में मैं सोच सकता हूं)।

समस्या यह है कि 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 ;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. सी # के साथ एक मैसकल डीबी से कनेक्ट करना - डेटासेट के साथ कुछ चाहिए

  2. PHP के साथ MySQL से utf8mb4 डेटा में हेरफेर करना

  3. क्या मैं JDBC कनेक्शन पूलिंग का उपयोग कर रहा हूँ?

  4. डेटाबेस में संग्रहीत करने से पहले पाठ को संपीड़ित करना

  5. प्राथमिक कुंजी Django MySQL अपडेट करें