MySQL आपको उसी स्टेटमेंट में टेबल से सेलेक्ट करने की अनुमति नहीं देता है, जहां आप उसी टेबल को अपडेट या डिलीट करते हैं।
mysql> UPDATE ch_15_posts SET ID = (select MAX(ID)+1 as max FROM `ch_15_posts`) where id = 0;
ERROR 1093 (HY000): You can't specify target table 'ch_15_posts' for update in FROM clause
एक समाधान एक प्रकार की डबल सबक्वायरी करने के लिए जो पहले आंतरिक सबक्वायरी का मूल्यांकन करता है, और परिणाम को अस्थायी तालिका में संग्रहीत करता है। हालांकि, यह आपको वह नहीं देगा जो आप चाहते हैं, क्योंकि यह केवल एक बार उप-उप-क्वेरी चलाता है, और यह एक एकल मान उत्पन्न करेगा और इसे आपकी सभी पंक्तियों में असाइन करेगा जहां id =0.
mysql> UPDATE ch_15_posts SET ID = (select max from (select MAX(ID)+1 as max FROM `ch_15_posts`) t) where id = 0;
Query OK, 3 rows affected (0.02 sec)
Rows matched: 3 Changed: 3 Warnings: 0
ऐसा लगता है कि आप उन पंक्तियों के लिए स्वत:वृद्धिशील मान निर्दिष्ट करने का प्रयास कर रहे हैं जहां आपने अनजाने में मान 0 सेट किया है। आप तालिका को लॉक किए बिना MAX(id)+1 पद्धति का उपयोग नहीं कर सकते, क्योंकि अन्य समवर्ती सत्र नई पंक्तियां सम्मिलित कर सकते हैं जब आप इसे कर रहे हों। तो यह एक दौड़ की स्थिति है।
लेकिन आप कॉलम को ऑटो-इंक्रीमेंट कुंजी बनाकर परमाणु रूप से ऑटो-इंक्रीमेंट मानों को बैकफ़िल कर सकते हैं।
डेमो:
mysql> create table c_15_posts (id int );
mysql> insert into c_15_posts values (0), (2), (0), (6), (0), (42);
Query OK, 6 rows affected (0.02 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql> alter table c_15_posts modify id int auto_increment primary key;
Query OK, 6 rows affected (0.04 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql> select * from c_15_posts;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 6 |
| 7 |
| 42 |
+----+
0 वाली पंक्तियाँ 43 से शुरू नहीं होती हैं, लेकिन वे अद्वितीय मान प्राप्त करती हैं। अगले इंसर्ट को आईडी 43 मिलेगी।