डुप्लिकेट कुंजी पर कुछ भी नहीं


14

मैं PtokaX एपीआई के साथ LuaSQL का उपयोग करके निम्नलिखित तालिका में सम्मिलित कर रहा हूं।

CREATE TABLE `requests` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `ctg` VARCHAR(15) NOT NULL,
    `msg` VARCHAR(250) NOT NULL,
    `nick` VARCHAR(32) NOT NULL,
    `filled` ENUM('Y','N') NOT NULL DEFAULT 'N',
    `dated` DATETIME NOT NULL,
    `filldate` DATETIME NULL DEFAULT NULL,
    PRIMARY KEY (`id`),
    UNIQUE INDEX `nick_msg` (`nick`, `msg`),
    UNIQUE INDEX `ctg_msg` (`ctg`, `msg`)
)
COMMENT='Requests from users in any of the categories.'
COLLATE='utf8_general_ci'
ENGINE=MyISAM;

अब, मेरी समस्या यह है, जब एक उपयोगकर्ता (द्वारा प्रतिनिधित्व किया गया nick) एक ही अनुरोध को फिर से सम्मिलित करने की कोशिश करता है, तो UNIQUEसूचकांक की जाँच की जाती है और स्क्रिप्ट झूठी हो जाती है। इससे मेरी स्क्रिप्ट विफल हो जाती है और मुझे स्क्रिप्ट को फिर से शुरू करना पड़ता है।

क्या ऐसा कुछ है जो मैं INSERT ... ON DUPLICATE KEYकमांड में कर सकता हूं ताकि यह कुछ भी न करे या कम से कम किसी मामले में त्रुटि न लौटाए DUPLICATE KEY?

अन्यथा मुझे अपने datedक्षेत्र को नए DATETIMEमूल्य के साथ अद्यतन करने के लिए जाना होगा ।

जवाबों:


23

तीन तरीके से। या तो IGNOREडुप्लिकेट त्रुटियां:

INSERT IGNORE 
  ... ;                   -- without ON DUPLICATE KEY

या डुप्लिकेट होने पर निरर्थक अपडेट करने का प्रयास करें:

INSERT 
  ... 
ON DUPLICATE KEY UPDATE
  id = id ;

या डालने से पहले डुप्लिकेट के लिए जाँच करें:

INSERT INTO requests
  (id, ctg, msg, nick, filled, dated, filldate)
SELECT
  NULL, 'urgent', 'Help!', 'Hermione', 'Y', NOW(), NOW()
FROM
  dual
WHERE NOT EXISTS
      ( SELECT *  FROM requests  WHERE (nick, msg) = ('Hermione', 'Help!') )
  AND NOT EXISTS
      ( SELECT *  FROM requests  WHERE (ctg, msg) = ('urgent', 'Help!') ) ;

तीसरे तरीके और पहले दो के बीच एक अंतर यह है कि जब डुप्लिकेट होते हैं, तो idवेतन वृद्धि नहीं होगी। साथ INSERT IGNOREऔर INSERT ... ON DUPLICATE KEY, यह स्वत: वृद्धि और के बाद से डालने नहीं किया जाएगा, तो आप के मूल्यों में अंतर होगा किया जाएगा id

मुझे यह भी जोड़ना चाहिए कि आपकी स्क्रिप्ट को हमेशा त्रुटियों की जांच करनी चाहिए और जब एक हो तो विफल नहीं होना चाहिए। कोई भी क्वेरी या स्टेटमेंट विभिन्न कारणों से कभी-कभी विफल हो सकता है और त्रुटि लौटा सकता है। ऊपर दिए गए ट्रिक आपको केवल एक तरह की त्रुटि से बचाएंगे।


1

विकल्प महान हैं, मैं सिर्फ एक चौथा जानता हूं। आप निम्नलिखित के रूप में एक प्रक्रिया बना सकते हैं (MySQL 5.5 या उच्चतर)।

DELIMITER ;;
CREATE PRODECURE...
...necessary parameters...
BEGIN

DECLARE v_dups BIGINT;
DECLARE CONTINUE HANDLER FOR 1062 SET v_dups = v_dups + 1;

-- RUN SIMPLE INSERT, IF IT TAKES DUPLICATE KEY NOTHING HAPPENS
END;;

अच्छा, मैं MySQL का उपयोग नहीं कर रहा हूँ हाल ही में तो मुझे पता नहीं था। क्या आप अपडेट कर सकते हैं और विस्तृत कर सकते हैं: क्या होता है यदि अन्य (डुप्लिकेट कुंजी उल्लंघन नहीं) त्रुटियां होती हैं? और यह कैसे ठीक से काम करता है (क्या 1062 के लिए खड़ा है)? क्या क्वेरी को एक एकल सम्मिलित करने की आवश्यकता है या यह कई पंक्तियों को सम्मिलित करने के साथ काम कर सकता है?
ypercube y

1062 डुप्लीकेट पंक्ति है। केवल यह SQL त्रुटि ट्रिगर होती है: SET v_dups = v_dups + 1;
बिलमास्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.