ऑटो वृद्धि रोकें डुप्लिकेट कुंजी अपडेट पर छोड़ें - mysql, अनुक्रमण, डालें

मेरे पास एक टेबल है

(ID INT auto_incrment primary key,
tag VARCHAR unique)

मैं एक पर कई टैग डालना चाहता हूं। इस कदर:

INSERT INTO tags (tag) VALUES ("java"), ("php"), ("phyton");

अगर मैं इसे निष्पादित कर दूंगा, और "जावा" पहले से ही तालिका में है, तो मुझे एक त्रुटि मिल रही है। यह "php" और "phyton" जोड़ नहीं है।

अगर मैं ऐसा करता हूं:

INSERT INTO tags (tag) VALUES ("java"), ("php"), ("phyton")
ON DUPLICATE KEY UPDATE tag = VALUES(tag)

यह बिना किसी त्रुटि के जोड़ा जाता है, लेकिन यह आईडी फ़ील्ड पर 2 मान छोड़ देता है।

उदाहरण: मेरे पास जावा है ID = 1 और मैं क्वेरी चलाता हूं। फिर PHP 3 और पायथन 4 होगा। आईडी को छोड़ दिए बिना इस क्वेरी को निष्पादित करने का कोई तरीका है?

मैं उनके बीच बड़ी जगह नहीं चाहता हूं। मैंने भी कोशिश की INSERT IGNORE

धन्यवाद!

उत्तर:

जवाब के लिए 0 № 1

"एसक्यूएल # 1" में देखें http://mysql.rjweb.org/doc.php/staging_table#normalization । यह अधिक जटिल है लेकिन "जलने" आईडी से बचाता है। इसमें किसी अन्य तालिका में टैग की आवश्यकता होने की संभावित कमी है। उस लिंक से एक स्निपेट:

# This should not be in the main transaction, and it should be
#    done with autocommit = ON
# In fact, it could lead to strange errors if this were part
#    of the main transaction and it ROLLBACKed.
INSERT IGNORE INTO Hosts (host_name)
SELECT DISTINCT s.host_name
FROM Staging AS s
LEFT JOIN Hosts AS n  ON n.host_name = s.host_name
WHERE n.host_id IS NULL;

इसे अपने लेनदेन के रूप में अलग करके, हम इसे जल्दबाजी में पूरा कर लेते हैं, जिससे अवरोध कम हो जाता है। कहने से IGNORE, अगर हम अन्य धागे समान होस्ट_नामों को सम्मिलित करते हैं तो हम परवाह नहीं करते हैं। (यदि आपके पास ऐसा कोई अन्य धागा नहीं है INSERTs, आप टॉस कर सकते हैं IGNORE।)

(फिर यह आईओडीकेयू के बारे में बात करने जा रहा है।)


संबंधित सवाल
सबसे लोकप्रिय