2016-11-30 13 views
6

मैं की तरहअद्यतन एक पंक्ति अगर मौजूद है अन्यथा सम्मिलित

id|user1|user2|paired 
--+-----+-----+--------+ 
1 |U_1 |null |false 

मैं एक रिकॉर्ड जहां = false बनती करने के लिए 'U_2' एक नया उपयोगकर्ता से मेल खाते हैं, या तालिका में एक नई प्रविष्टि बनाने की जरूरत एक मेज 'मैच' है अगर कोई unpaired पंक्ति नहीं मिली है।

यह डीबी एक सर्वर से जुड़ा हुआ है जहां एकाधिक उपयोगकर्ता जोड़े जाने की कोशिश कर रहे हैं, इसलिए मुझे सबसे अच्छा संभव समाधान ढूंढना होगा जो इसे तेज़ बनाता है ताकि यह लंबे समय तक तालिका को लॉक न करे।

समाधान मैं के साथ आया था

int matchId = select id from match where ((user1 != 'U_2') AND (paired = false)); 

if(matchId > 0) 
then 
    update table match set user2 = 'U_2' where id = matchId; 
else 
    insert new row. 

एक बेहतर तरीका सुझाव दें।

अग्रिम धन्यवाद।

+0

साथ आपका मौजूदा समाधान मेरे लिए ठीक दिखता है। यह बहुत आसान लग रहा है, क्या आप यहां एक विशिष्ट प्रदर्शन समस्या देख रहे हैं? – worpet

+1

उत्तर देने के लिए धन्यवाद। मैं जानना चाहता था कि ऐसा करने के लिए बल्लेबाज तरीका था या नहीं। डेटाबेस 2 बार पूछताछ की एक बहुत बड़ी तालिका में देखकर प्रतिक्रिया समय में वृद्धि हो सकती है। और 2 या अधिक उपयोगकर्ताओं को पहली क्वेरी से एक ही आईडी प्राप्त करने की संभावना भी है। और फिर वे एक ही पंक्ति को अद्यतन कर सकते हैं। –

उत्तर

8

आप

  • अद्वितीय सूचकांक user1 और user2 के लिए गति में सुधार और अखंडता को आश्वस्त करने के लिए जोड़ सकते हैं।
  • टकराव से बचने के लिए लेनदेन का उपयोग करें।
  • एक अद्यतन में चुनिंदा और अद्यतन क्वेरी गठबंधन:

    update table match 
    set user2 = 'U_2' 
    where ((user1 != 'U_2') AND (paired = false)) 
    LIMIT 1; 
    
  • जांच करता है, तो अद्यतन affected rows है। यदि नहीं, तो नई पंक्ति डालें।

अगर मैं अपने उत्कटता ठीक से समझ, आप भी कर सकते हैं:

  • स्तंभ paired निकालते हैं तो वह निरर्थक होने के लिए यह हमेशा होता है के बाद से false जब user2=null
+0

लेकिन दोनों उपयोगकर्ताओं को कई बार जोड़ा जा सकता है। और इस तरह से मैं अद्यतन पंक्ति से डेटा अनुरोध करने के लिए उपयोगकर्ता अनुरोध करने में सक्षम नहीं होगा .. या इसके लिए कोई रास्ता भी है? –

+0

मैं code_angel के उत्तर से सहमत हूं। अद्यतन का प्रयोग करें और कोई प्रभावित पंक्तियों को सम्मिलित करें। यदि अपडेट सफल हुआ, तो बस एक चयन के साथ जानकारी प्राप्त करें (उस उपयोगकर्ता के लिए नवीनतम रिकॉर्ड प्राप्त करने के लिए टाइमस्टैम्प का उपयोग करें) या [यह] जांचें (http://stackoverflow.com/questions/1388025/how-to-get-id- अद्यतन से सीधे आईडी प्राप्त करने के लिए थ्रेड-एंड-अपडेटेड-पंक्ति-इन-माइस्क्ल) थ्रेड। –

+0

जब एकाधिक मैचों की अनुमति दी जानी चाहिए, तो एस रूज ने कहा, एक मैच के लिए एक अतिरिक्त टाइमस्टैम्प कॉलम का उपयोग करें। आप उपयोगकर्ता 1, उपयोगकर्ता 2 और टाइमस्टैम्प पर अद्वितीय कुंजी बना सकते हैं। या सिर्फ उपयोगकर्ता 1 और टाइमस्टैम्प पर। यह विवरण पर निर्भर करता है। –

3

एक एकल लगता है कथन एक या दूसरे करता है:

INSERT INTO match 
    (user1, paired, user2) 
    VALUES 
    ('U_2', false, 'U_2') -- either insert this 
ON DUPLICATE KEY UPDATE 
    user2 = VALUES(user2); -- or update this 

PRIMARY KEY(user1, paired) -- a UNIQUE key to control what is "DUPLICATE" 
+0

इस मामले के लिए नहीं। कई से कई संबंध हैं। यह वास्तव में परिभाषित नहीं किया गया था कि सवाल में ओपी का अर्थ है 'नई पंक्ति डालें'। लेकिन मेरे उत्तर के नीचे संदर्भ और टिप्पणियों से, यह स्पष्ट है: 'दोनों उपयोगकर्ताओं को किसी भी समय के लिए जोड़ा जा सकता है' –

संबंधित मुद्दे