संपादित करें:
इस पोस्ट पर उपयोगकर्ता की टिप्पणी के बाद संपादित:
आपको टेबल लॉकिंग लिखना चाहिए उन दोनों प्रक्रियाओं पर।
WRITE लॉक में निम्नलिखित विशेषताएं होती हैं:
-
टेबल का लॉक रखने वाला एकमात्र सत्र टेबल से डेटा पढ़ और लिख सकता है।
-
अन्य सत्र WRITE लॉक जारी होने तक तालिका से डेटा नहीं पढ़ सकते हैं और डेटा नहीं लिख सकते हैं।
SQL UNIQUE Constraint भी देखें।
संपादित करने से पहले:
हाँ, ऐसा सम्भव है। और मुझे यह पता लगाने में थोड़ा समय लगा। मैं इसे आपके इनपुट पर बनाता हूं और टेस्ट 1, टेस्ट 2 इत्यादि के रूप में मूल्यों की तुलना करता हूं, जहां परीक्षण हमेशा समान होता है और पिछली संख्या होती है। जैसा कि आपने निर्दिष्ट किया था।
इसे MySQL TRANSACTION के रूप में किया जा सकता है 4 चरणों में।
मान लें कि आपके पास टेबल है testT
जहां नाम बीमा के लिए अद्वितीय है, हमारे पास कोई युगल नहीं है।
| id | name |
| --- | ----- |
| 1 | test1 |
| 2 | test3 |
और आप हमारे द्वारा निर्धारित नाम test1 के साथ एक नया आइटम सम्मिलित करना चाहते हैं:
SET @newName = 'test1';
फिर हमें यह जांचना होगा कि क्या यह पहले से ही तालिका में मौजूद है:
SELECT @check:=COUNT(*) FROM testT WHERE name = @newName;
हम यहां सही या गलत होने के लिए गिनती करते हैं और इसे @check
. के रूप में सहेजते हैं यहाँ ताकि हम बाद में इसकी तुलना कर सकें। इसका परिणाम 1 row
में होगा test1
. के रूप में तालिका में पहले से मौजूद है।
इसके बाद हम सबसे अधिक परीक्षण* प्राप्त करने के लिए एक और चयन करते हैं और इसे @number
. के रूप में संग्रहीत करते हैं , यह अगली क्वेरी सभी परीक्षणों का चयन करती है और 4 बाद वाले के बाद हमें पहले 4 बाद के सभी नंबर देने के बाद एक सबस्ट्रिंग करती है। (99999999999) संख्याएं वास्तव में केवल यह सुनिश्चित करने के लिए हैं कि हम कोई चूक न करें लेकिन हमारे मामले में परिणाम केवल "3" है क्योंकि वह अंतिम रिकॉर्ड है "test3
"तालिका में।
SELECT
@number:= SUBSTRING(name,5,99999999999)
FROM testT;
अब हम एक इन्सर्ट कर सकते हैं:
INSERT INTO testT(name)
VALUES
(
IF(@check = "", @newName , CONCAT(LEFT(@newName,4),RIGHT(@number,1)+1)
)
);
यह हमारे @newName
. को सम्मिलित करने का प्रयास करता है तालिका में IF शर्त के तहत, और वह यह है कि यदि हमारा @check
खाली है तो वह @newName
insert डालेगा , यदि नहीं तो यह स्ट्रिंग से शब्द परीक्षण लेगा और उच्चतम @number
. जोड़ देगा पहले से और इसमें + 1 भी जोड़ें।
तो परिणाम @newName = 'test1'
. के लिए नीचे है। अगर आप इसे @newName = 'test3'
. में बदलते हैं परिणाम वही नया इंसर्ट होगा test4
।
**Schema (MySQL v5.7)**
SET @newName = 'test1';
---
**Query #1**
SELECT * FROM testT
ORDER BY id;
| id | name |
| --- | ----- |
| 1 | test1 |
| 2 | test3 |
| 3 | test4 |
---
और यदि आप इसे किसी भी परीक्षण* में बदलते हैं तो वह संख्या पहले से मौजूद नहीं है, यह इसे सामान्य रूप से सम्मिलित करेगा। नीचे दिए गए मामले में:@newName = 'test6'
SET @newName = 'test6';
**Query #1**
SELECT * FROM testT
ORDER BY id;
| id | name |
| --- | ----- |
| 1 | test1 |
| 2 | test3 |
| 3 | test6 |
इस तरह एक इंसर्ट हमेशा बनाया जाएगा।
आप इसके साथ यहां खेल सकते हैं:DB Fiddle पर देखें
बस SET @newName = 'test6'
. को बदलकर
मैं कोई विशेषज्ञ नहीं हूं और मुझे इस तरह से पता लगाने में कुछ घंटे लग गए, क्योंकि मैं जानना चाहता था कि क्या यह संभव है। और अगर कोई अन्य उपयोगकर्ता किसी अन्य तरीके से सुझाव दे सकता है या मेरी विधि में सुधार कर सकता है तो मैं सराहना करता हूं।