2012-05-22 12 views
21

हमारे पास एक डेटाबेस है जो क्रोनबॉज के साथ आधी रात को अपडेट किया जाता है, हमें बाहरी एक्सएमएल से नया डेटा मिलता है।कैसे पता चलेगा कि "डुप्लिकेट कुंजी अपडेट पर" उपयोग करते समय एक पंक्ति डाली या अपडेट की गई थी?

हम क्या करते हैं कि हम सभी नई सामग्री डालें और यदि कोई डुप्लीकेट कुंजी है तो हम उस फ़ील्ड को अपडेट करते हैं।

INSERT INTO table (id, col1, col2, col3) 
values (id_value, val1, val2, val3), 
(id_value, val1, val2, val3), 
(id_value, val1, val2, val3), 
(id_value, val1, val2, val3), 
ON DUPLICATE KEY UPDATE 
col1 = VALUES (col1), 
col2 = VALUES (col2), 
col3 = VALUES (col3); 

हम क्या जानना चाहते हैं कि वास्तव में कौन सी पंक्तियां डाली गई हैं, जिसका अर्थ है कि हम नए आइटमों की एक सूची चाहते हैं। क्या कोई ऐसी क्वेरी है जो नए आवेषण वापस कर सकती है? असल में हमें सभी नए आईडी प्राप्त करने की आवश्यकता होगी, न कि नए प्रविष्टियों की संख्या।

धन्यवाद

उत्तर

6

एक update_count INT NOT NULL DEFAULT 1 स्तंभ जोड़ें और आपकी क्वेरी को बदलें:

INSERT 
INTO table (id, col1, col2, col3) 
VALUES 
(id_value, val1, val2, val3), 
(id_value, val1, val2, val3,), 
(id_value, val1, val2, val3), 
(id_value, val1, val2, val3), 
ON DUPLICATE KEY 
UPDATE 
     col1 = VALUES (col1), 
     col2 = VALUES (col2), 
     col3 = VALUES (col3), 
     update_count = update_count + 1; 

आप भी इसे एक BEFORE UPDATE ट्रिगर जो आप क्वेरी रखने के लिए है के रूप में की अनुमति देगा में भी वृद्धि कर सकते हैं।

+0

धन्यवाद Quassnoi, अच्छा विचार है, मैंने उडपेटेड नामक एक नए कॉलम का उपयोग किया है और आपके विचार को विभिन्न दृष्टिकोण के साथ लागू किया है जो वास्तव में महान काम करता है मैं, कृपया किए गए संशोधनों के लिए अपने उत्तर की समीक्षा करें और मुझे कुछ प्रतिक्रिया दें। यह बहुत अच्छा काम किया। – multimediaxp

26

आप परिणाम सेट में प्रभावित पंक्तियों की संख्या का परीक्षण करके सम्मिलित/अपडेट करने के समय में यह जानकारी प्राप्त कर सकते हैं।

MySQL documentation कहता है:

पर नकली चाबी अद्यतन के साथ, प्रति पंक्ति प्रभावित-पंक्तियों मान 1 यदि पंक्ति एक नई पंक्ति के रूप में डाला जाता है और 2 यदि कोई मौजूदा पंक्ति अद्यतन किया जाता है है।

आपको अपना उत्तर प्राप्त करने के लिए RAS_COUNT को LAST_INSERT_ID के साथ जोड़ना होगा और एक समय में एक पंक्ति डालना होगा।

+1

यह पता लगाने के लिए * कितने * पंक्तियों डाला गया बनाम अद्यतन में मदद करता है, लेकिन नहीं जो थे जो ... – eggyal

+0

हाँ हम के बारे में सोचा लेकिन मुझे पंक्तियों की प्राथमिक कुंजी को डालने की जरूरत है, न कि पंक्तियों की संख्या या संख्या डाली गई है। – multimediaxp

+0

@EddyXP, आपको अपना जवाब प्राप्त करने और एक समय में एक पंक्ति डालने के लिए RAS_COUNT को LAST_INSERT_ID के साथ संयोजित करने की आवश्यकता होगी। –

0

तालिका में एक टाइमस्टैम्प फ़ील्ड जोड़ें, और इसका डिफ़ॉल्ट मान current_timestamp पर सेट करें, लेकिन ON UPDATE CURRENT_TIMESTAMP सेट न करें। इस तरह, यदि आप जानते हैं कि आपका क्रॉन नौकरी किस समय चलती है, तो आप उन पंक्तियों से पूछ सकते हैं जो उस समय या उसके बाद जोड़े गए थे, लेकिन सफल क्रॉन नौकरी से पहले, या अंत समय जो आप जानते हैं कि क्रॉन पूरा हो जाएगा ।

Alter table your_table add column create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP स्वचालित रूप से केवल आवेषण के लिए create_time फ़ील्ड को अद्यतन करना चाहिए, अपडेट के लिए नहीं।

आप MySQL documentation पर पढ़ें:

एक डिफ़ॉल्ट खंड के साथ

लेकिन कोई पर अद्यतन CURRENT_TIMESTAMP खंड, स्तंभ दिया डिफ़ॉल्ट मान है और स्वचालित रूप से वर्तमान टाइमस्टैम्प के लिए अद्यतन नहीं है।

डिफ़ॉल्ट पर निर्भर करता है कि DEFAULT खंड CURRENT_TIMESTAMP या निरंतर मान निर्दिष्ट करता है या नहीं। CURRENT_TIMESTAMP के साथ, डिफ़ॉल्ट वर्तमान टाइमस्टैम्प है।

तो योग करने के लिए, SELECT id from your_table where create_timestamp >= $cron_1_time and create_timestamp < $cron_2_time; की तरह एक प्रश्न आप देना चाहिए कि आप क्या देख रहे हैं। बेशक, यह सब आप पर निर्भर करता है कि क्रॉन नौकरियां कब चलती हैं और कितनी देर तक।

0

मैं कह सकता हूँ मैं PHP में कैसे किया:

1) सरल प्रश्न मैक्स (आईडी) का चयन करें और मेज से $ max_id करने के लिए इसे सम्मिलित पर डुप्लिकेट से पहले याद है।

2) फिर अद्यतन प्रक्रिया के दौरान प्रभावित पंक्तियों की आईडी एकत्र करें (कोई नया नया या अस्तित्व में नहीं है): $ ids [] = mysql_insert_id();

3) फिर $ inserted_rows = अधिकतम ($ ids) - $ max_id;

4) अपडेट किया गया पंक्तियों = गिनती ($ ids_srt) - $ inserted_rows

$max_id = mysql_query("SELECT MAX(id) from table"); 
$max_id = mysql_result($max_id, 0); 

// !!! prepare here 'insert on duplicate' query in a cycle 

$result=mysql_query($query); 
$ids[] = mysql_insert_id(); 

// finish inserting and collecting affected ids and close cycle 

$inserted_rows = max($ids)- $max_id; 
$updated_rows = count($ids)- $inserted_rows 
संबंधित मुद्दे