समाधान: DELETE के बाद सशर्त UPDATE
एक पंक्ति हटाने के बाद, अधिक ID वाली पंक्तियों को डिक्रीमेंट करके क्रम को बनाए रखें।
व्यावहारिक उदाहरण
टेबल बनाना और डेटा डालना
mysql> CREATE TABLE ReorderSortDemo (UserId INT);
mysql> INSERT INTO ReorderSortDemo VALUES
-> (14), (4), (6), (3), (8), (18), (1), (11), (16);
मूल डेटा (9 पंक्तियाँ, क्रमबद्ध नहीं)
| UserId |
|---|
| 14 |
| 4 |
| 6 |
| 3 |
| 8 |
| 18 |
| 1 |
| 11 |
| 16 |
चरण 1: UserId=8 वाली पंक्ति हटाना
mysql> DELETE FROM ReorderSortDemo WHERE UserId = 8; Query OK, 1 row affected
चरण 2: 8 से बड़ी सभी ID को 1 से घटाना
mysql> UPDATE ReorderSortDemo
-> SET UserId = UserId - 1
-> WHERE UserId > 8;
Query OK, 4 rows affected
अंतिम परिणाम
| UserId (पहले) | UserId (बाद में) | परिवर्तन |
|---|---|---|
| 14 | 13 | -1 |
| 4 | 4 | कोई नहीं |
| 6 | 6 | कोई नहीं |
| 3 | 3 | कोई नहीं |
| 8 | हटाया गया | - |
| 18 | 17 | -1 |
| 1 | 1 | कोई नहीं |
| 11 | 10 | -1 |
| 16 | 15 | -1 |
⚠️ महत्वपूर्ण चेतावनी
- विदेशी कुंजी संबंध टूट जाएंगे
- एप्लिकेशन लॉजिक प्रभावित हो सकता है
- ऑडिट ट्रेल/इतिहास अमान्य हो जाता है
- समवर्ती पहुंच के साथ रेस कंडीशन
बेहतर विकल्प
- सॉफ्ट डिलीट:
deleted_atटाइमस्टैम्प कॉलम जोड़ें - गैप स्वीकार करें: ऑटो-इंक्रीमेंट गैप सामान्य और हानिरहित हैं
- अलग क्रम कॉलम:
sort_orderकॉलम का उपयोग करें जिसे सुरक्षित रूप से अद्यतन किया जा सके - विंडो फ़ंक्शन (MySQL 8.0+):
ROW_NUMBER() OVER (ORDER BY UserId)रनटाइम पर क्रमांक के लिए
यदि आवश्यक हो तो पूरी तरह से पुनर्क्रमित करना (1 से शुरू)
SET @rownum = 0; UPDATE ReorderSortDemo SET UserId = (@rownum := @rownum + 1) ORDER BY UserId;
लेकिन फिर भी: प्राथमिक कुंजी न बदलें!