2009-04-18 9 views
14

पाया जाता है, तो अक्सर, मैं अपने उपयोगकर्ताओं में से एक पर एक क्वेरी चलाने के लिए चाहता हूं जहां मैं उस उपयोगकर्ता के साथ संग्रहीत और संबंधित एक पंक्ति चाहता हूं, एक 1 से 1 रिश्ते। तो मान लें (यह सिर्फ एक मनमाना उदाहरण है), कि मेरे पास एक टेबल है जो कार के बारे में कुछ जानकारी के साथ उपयोगकर्ता की कार का ट्रैक रखती है। प्रत्येक उपयोगकर्ता के पास 0 या 1 कार हो सकती है। यदि उपयोगकर्ता की कोई कार नहीं है, तो उस उपयोगकर्ता के लिए तालिका में कोई प्रविष्टि नहीं है।MySQL "अच्छा" तरीका एक पंक्ति डालने के लिए नहीं मिला है, या इसे

कारों तालिका (फिर से, बस एक उदाहरण): आईडी, user_id, car_make, car_model

तो, जब मैं इस तालिका अद्यतन करते हैं, मैं हमेशा इस (छद्म कोड) की तरह कुछ कर रही अंत:

result = SELECT * FROM cars WHERE user_id=5 
if (num_rows(result)>0){ 
    UPDATE cars SET car_make='toyota', car_model='prius' WHERE user_id=5 
}else{ 
    INSERT INTO cars (user_id, car_make, car_model) VALUES (5, 'toyota', 'prius') 
} 

मैं इसे एक सुंदर कथन में कैसे बना सकता हूं जो "परमाणु रूप से" काम करता है? क्या होता है, अगर किसी अन्य प्रक्रिया में, पंक्ति को चयन और अद्यतन विवरणों के बीच हटा दिया जाता है? मेरा अद्यतन कथन विफल हो जाएगा जहां INSERT कथन चलाना चाहिए था। और मुझे लगता है कि मुझे एक ही चीज़ को पूरा करने के लिए दो समान (लेकिन अलग) बयान करने की ज़रूरत है! मुझे जो कुछ चाहिए वह कुछ बयान है जो मुझे आश्वस्त करेगा कि मैं जो डेटा चाहता हूं वह तालिका में मौजूद है, खासकर जब मैं केवल 1 पंक्ति चाहता हूं जो मेरी आवश्यकता को पूरा करे।

MAKE SURE A ROW IN cars WHERE user_id=5 IS SET WITH car_make='toyota', car_model='prius' 

इस तरह, यदि 5 user_id पहले से मौजूद है, यह अद्यतन किया जाएगा, अन्यथा, यह डाला जाएगा: उदाहरण के लिए, यह की तरह कुछ (बेशक यह पूरी तरह से किया जाता है बना-अप) हो सकता है। इसके अलावा, अगर मैं आवश्यकताओं बदल गया है, उदाहरण के कहने के लिए प्रत्येक उपयोगकर्ता किसी दिए गए car_make के शून्य या एक कारों हो सकता है के लिए, तो मैं आगे कहा कि निर्दिष्ट कर सकते हैं:

MAKE SURE A ROW IN cars WHERE user_id=5 AND car_make='toyota' IS SET WITH car_model='prius' 

मुझे आशा है कि मेरे सवाल समझ में आता है! मैं इस बुनियादी सम्मिलन को कैसे सुधार सकता हूं-अगर नहीं मिला या अद्यतन-अगर-पाया गया ऑपरेशन जो अक्सर आता है? किसी भी मदद के लिए धन्यवाद!

उत्तर

0

ओरेकल में आपके पास Merge है।

MySQL पर कोई विचार नहीं है, लेकिन यह शब्द आपको खोज के लिए कुछ और दे सकता है।

2

इसे यूपीएसईआरटी (यूपी दिनांक या एसईआरटी) कहा जाता है। इसके बारे में कई सारे प्रश्न हैं जिनके लिए आप खोज सकते हैं। See Wikipedia

संपादित करें: MySQL 4.1+ INSATE (आईएनएस ईआरटी या upd एटीई) का समर्थन करता है, जो, आप एक ही बात मिलना चाहिए जब तक आप एक प्राथमिक कुंजी है के रूप में। MySQL Manual

16

आप "REPLACE INTO" या "INSERT… ON DUPLICATE KEY UPDATE" का उपयोग कर सकते हैं। मेरा मानना ​​है कि दूसरा वह है जो आप चाहते हैं, लेकिन ऐसी परिस्थितियां हैं जहां स्थानांतरित होना सुविधाजनक है।

1

मुझे लगता है कि इसे चारों ओर स्विच करना आसान है। सम्मिलित करने का प्रयास करें, फिर अद्यतन करें।

MySQL विशेष रूप से एक खंड 'पर नकली चाबी'

INSERT INTO कारें (क्षेत्र) मूल्यों (मान) पर नकली चाबी अद्यतन ...

निश्चित रूप से यह उचित अद्वितीय कुंजी सेटअप करने की आवश्यकता है है ।

0

कैसे मैं पर नकली चाबी अद्यतन का इस्तेमाल किया है का एक उदाहरण: सम्मिलित करें रजिस्ट्री में (नाम, मूल्य) मूल्यों (' "$ कुंजी।।"', ' "$ वैल।।"') पर नकली चाबी अद्यतन मूल्य = ' "$ वैल।।"' "

5

my other Stack Overflow answer से:

आप एक ही बयान में यह करने के लिए चाहते हैं, मैं, INSERT ... ON DUPLICATE KEY UPDATE सिंटेक्स के उपयोग की सलाह देते हैं इस प्रकार है:

INSERT INTO table (id, someothervalue) VALUES (1, 'hi mom') 
    ON DUPLICATE KEY UPDATE someothervalue = 'hi mom'; 

प्रारंभिक INSERT कथन ई होगा xecute अगर निर्दिष्ट कुंजी मान (या तो प्राथमिक कुंजी या अद्वितीय) के साथ कोई मौजूदा रिकॉर्ड नहीं है। यदि कोई रिकॉर्ड पहले से मौजूद है, तो निम्नलिखित UPDATE कथन (someothervalue = 3) निष्पादित किया गया है।

यह MySQL के सभी संस्करणों में समर्थित है। अधिक जानकारी के लिए, MySQL Reference Manual page for INSERT ... ON DUPLICATE KEY UPDATE

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