MySQL में insert इन्सर्ट नहीं तो कैसे डालें ’?


838

मैंने गुग्लिंग द्वारा शुरू किया, और यह लेख मिला जो म्यूटेक्स तालिकाओं के बारे में बात करता है।

मेरे पास ~ 14 मिलियन रिकॉर्ड के साथ एक तालिका है। यदि मैं एक ही प्रारूप में अधिक डेटा जोड़ना चाहता हूं, तो क्या यह सुनिश्चित करने का एक तरीका है कि मैं जो रिकॉर्ड सम्मिलित करना चाहता हूं, वह पहले से मौजूद नहीं है एक जोड़ी प्रश्नों का उपयोग किए बिना (यानी, जांच करने के लिए एक क्वेरी और सम्मिलित करने के लिए एक परिणाम सेट है। खाली)?

क्या यह पहले से ही वहाँ है, तो uniqueएक क्षेत्र पर एक बाधा की गारंटी देता है insert?

ऐसा लगता है कि केवल एक बाधा के साथ, जब मैं php के माध्यम से प्रविष्टि जारी करता हूं, तो स्क्रिप्ट क्रोक्स करता है।



Auto_inc मान नहीं जलाने के बारे में चर्चा के लिए stackoverflow.com/questions/44550788/… देखें ।
रिक जेम्स

@ रिकजम्स - यह एक दिलचस्प q है .. लेकिन यकीन नहीं है कि यह सीधे इस q से संबंधित है :)
वॉरेन

1
यह एक टिप्पणी में उल्लेख किया गया था, और अन्य प्रश्न ने दावा किया कि यह प्रश्न "सटीक डुप्लिकेट" था। इसलिए, मुझे लगा कि दूसरों के लाभ के लिए प्रश्नों को एक साथ जोड़ना एक अच्छा विचार था।
रिक जेम्स

1
ओह, मैं कभी साइड बार को देखने के लिए नहीं सोचता।
रिक जेम्स

जवाबों:


806

उपयोग INSERT IGNORE INTO table

http://bogdan.org.ua/2007/10/18/mysql-insert-if-not-exists-synxax.html देखें

INSERT … ON DUPLICATE KEY UPDATEसिंटैक्स भी है, आप dev.mysql.com पर स्पष्टीकरण पा सकते हैं


Google के वेबचे के अनुसार bogdan.org.ua से पोस्ट करें :

18 अक्टूबर 2007

शुरू करने के लिए: नवीनतम MySQL के रूप में, शीर्षक में प्रस्तुत सिंटैक्स संभव नहीं है। लेकिन मौजूदा कार्यक्षमता का उपयोग करके जो अपेक्षित है उसे पूरा करने के कई बहुत आसान तरीके हैं।

3 संभावित समाधान हैं: INSERT IGNORE, REPLACE, या INSERT ... का उपयोग करके DUPLICATE कुंजी का उपयोग करें।

कल्पना कीजिए कि हमारे पास एक मेज है:

CREATE TABLE `transcripts` (
`ensembl_transcript_id` varchar(20) NOT NULL,
`transcript_chrom_start` int(10) unsigned NOT NULL,
`transcript_chrom_end` int(10) unsigned NOT NULL,
PRIMARY KEY (`ensembl_transcript_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

अब कल्पना करें कि हमारे पास एक स्वचालित पाइपलाइन है जो एनसेंबल से मेटा-डेटा का आयात करता है, और यह कि विभिन्न कारणों से पाइपलाइन निष्पादन के किसी भी चरण में टूट सकती है। इस प्रकार, हमें दो चीजें सुनिश्चित करने की जरूरत है:

  1. पाइपलाइन के बार-बार निष्पादन से हमारा डेटाबेस नष्ट नहीं होगा

  2. 'डुप्लिकेट प्राइमरी की' त्रुटियों के कारण बार-बार निष्पादन नहीं होगा।

विधि 1: REPLACE का उपयोग कर

यह बहुत सरल है:

REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;

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

विधि 2: INSERT IGNORE का उपयोग करना बहुत सरल है:

INSERT IGNORE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;

यहां, यदि 'ensembl_transcript_id' डेटाबेस में पहले से मौजूद है, तो इसे चुपचाप छोड़ दिया जाएगा (अनदेखा कर दिया जाएगा)। (अधिक सटीक होने के लिए, यहां MySQL संदर्भ मैनुअल का एक उद्धरण है: “यदि आप IGNORE कीवर्ड का उपयोग करते हैं, तो INSERT स्टेटमेंट को निष्पादित करते समय होने वाली त्रुटियों को चेतावनी के रूप में माना जाता है। उदाहरण के लिए, IGNORE के बिना, एक पंक्ति जो एक मौजूदा UNIQUE इंडेक्स को डुप्लिकेट करती है। या तालिका में प्राथमिक कुंजी मान डुप्लिकेट-कुंजी त्रुटि का कारण बनता है और कथन निरस्त कर दिया जाता है। ") यदि रिकॉर्ड अभी तक मौजूद नहीं है, तो इसे बनाया जाएगा।

इस दूसरी विधि में कई संभावित कमजोरियां हैं, जिसमें किसी अन्य समस्या के होने पर (मैनुअल देखें) क्वेरी का गैर-गर्भपात भी शामिल है। इस प्रकार इसका उपयोग किया जाना चाहिए यदि पहले बिना IGNORE कीवर्ड के परीक्षण किया गया हो।

विधि 3: INSERT का उपयोग कर… DUPLICATE KEY पर अद्यतन करें:

तीसरा विकल्प INSERT … ON DUPLICATE KEY UPDATE सिंटैक्स का उपयोग करना है, और UPDATE भाग में बस कुछ अर्थहीन (खाली) ऑपरेशन नहीं करना है, जैसे 0 + 0 की गणना करना (ज्योफ्रे सुझाव देता है कि इस ऑपरेशन को अनदेखा करने के लिए MySQL ऑप्टिमाइज़ेशन इंजन के लिए id = id असाइनमेंट कर रहा है)। इस पद्धति का लाभ यह है कि यह केवल डुप्लिकेट प्रमुख घटनाओं को अनदेखा करता है, और अभी भी अन्य त्रुटियों पर गर्भपात करता है।

अंतिम सूचना के रूप में: यह पोस्ट Xaprb से प्रेरित थी। मैं लचीली एसक्यूएल क्वेरी लिखने पर उनके अन्य पोस्ट से परामर्श करने की सलाह दूंगा।


3
और क्या मैं स्क्रिप्ट को गति देने के लिए "देरी" के साथ जोड़ सकता हूं?
वॉरेन

3
हां, देरी से डालने से आपके लिए चीजें तेज हो सकती हैं। इसे आज़माएं
9

32
हां, और ध्यान रखें कि REPLACE INTO DELETE करता है , तो INSERT, UPDATE नहीं
bobobobo

10
INSERT … ON DUPLICATE KEY UPDATEयह बेहतर है क्योंकि यह पंक्ति को नहीं हटाता है, किसी भी auto_incrementस्तंभ और अन्य डेटा को संरक्षित करता है।
रेडॉलेंट डिस

14
बस सभी को सूचित करना है। INSERT … ON DUPLICATE KEY UPDATEविधि का उपयोग विफल प्रविष्टि के साथ किसी भी AUTO_INCREMENT कॉलम को बढ़ाता है। शायद इसलिए कि यह वास्तव में विफल नहीं है, लेकिन अद्यतन करें।
not2qubit

216

समाधान:

INSERT INTO `table` (`value1`, `value2`) 
SELECT 'stuff for value1', 'stuff for value2' FROM DUAL 
WHERE NOT EXISTS (SELECT * FROM `table` 
      WHERE `value1`='stuff for value1' AND `value2`='stuff for value2' LIMIT 1) 

स्पष्टीकरण:

अंतरतम क्वेरी

SELECT * FROM `table` 
      WHERE `value1`='stuff for value1' AND `value2`='stuff for value2' LIMIT 1

WHERE NOT EXISTS-कॉन्डिशन के रूप में उपयोग किया जाता है अगर पहले से मौजूद डेटा के साथ एक पंक्ति मौजूद है। इस तरह की एक पंक्ति पाए जाने के बाद, क्वेरी रुक सकती है, इसलिए LIMIT 1(माइक्रो-ऑप्टिमाइज़ेशन, छोड़ा जा सकता है)।

मध्यवर्ती क्वेरी

SELECT 'stuff for value1', 'stuff for value2' FROM DUAL

सम्मिलित किए जाने वाले मानों का प्रतिनिधित्व करता है। DUALसभी ओरेकल डेटाबेस में एक विशेष एक पंक्ति, एक कॉलम टेबल डिफ़ॉल्ट रूप से मौजूद है ( https://en.wikipedia.org/wiki/DUAL_table देखें )। MySQL-Server संस्करण 5.7.26 पर मुझे छोड़ते समय एक मान्य क्वेरी मिली FROM DUAL, लेकिन पुराने संस्करणों (जैसे 5.5.60) में FROMजानकारी की आवश्यकता होती है । WHERE NOT EXISTSअगर अंतरतम मिलान डेटा मिला तो मध्यवर्ती क्वेरी का उपयोग करके एक खाली परिणाम सेट देता है।

बाहरी क्वेरी

INSERT INTO `table` (`value1`, `value2`) 

यदि कोई डेटा मध्यवर्ती क्वेरी द्वारा वापस किया जाता है, तो डेटा सम्मिलित करता है।


4
क्या आप इसका उपयोग करने के बारे में कुछ और जानकारी दे सकते हैं?
एलेक्स वी

36
यह वैरिएंट उपयुक्त है यदि टेबल पर कोई अनोखी कुंजी मौजूद नहीं है ( INSERT IGNOREऔर INSERT ON DUPLICATE KEYअद्वितीय कुंजी बाधाओं की आवश्यकता है)
rabudde

2
यदि आप "तालिका से" के बजाय पंक्ति 2 पर "दोहरी" से उपयोग करते हैं, तो आपको "सीमा 1" खंड की आवश्यकता नहीं है।
रिच

6
क्या होगा stuff for value1और अगर stuff for value2समान हैं? यह एकDuplicate column name
रॉबिन

1
मैं उपश्रेणियों के SELECT 1बजाय बहुत पसंद करता हूं SELECT *। बहुत अधिक संभावना है कि यह एक सूचकांक से संतुष्ट हो सकता है।
आर्थर

58

डुप्लिकेट कुंजी अद्यतन पर , या उपेक्षा डालें MySQL के साथ व्यवहार्य समाधान हो सकते हैं।


Mysql.com पर आधारित डुप्लिकेट कुंजी अद्यतन अद्यतन का उदाहरण

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

UPDATE table SET c=c+1 WHERE a=1;

सम्मिलित करने का उदाहरण mysql.com पर आधारित है

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name [(col_name,...)]
    {VALUES | VALUE} ({expr | DEFAULT},...),(...),...
    [ ON DUPLICATE KEY UPDATE
      col_name=expr
        [, col_name=expr] ... ]

या:

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name
    SET col_name={expr | DEFAULT}, ...
    [ ON DUPLICATE KEY UPDATE
      col_name=expr
        [, col_name=expr] ... ]

या:

INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name [(col_name,...)]
    SELECT ...
    [ ON DUPLICATE KEY UPDATE
      col_name=expr
        [, col_name=expr] ... ]

24

यदि कोई अपवाद स्वीकार्य हो तो किसी भी सरल बाधा को काम करना चाहिए। उदाहरण :

  • सरोगेट नहीं तो प्राथमिक कुंजी
  • एक स्तंभ पर अद्वितीय बाधा
  • बहु-स्तंभ अद्वितीय बाधा

क्षमा करें, यह भ्रामक सरल लगता है। मुझे पता है कि यह आपके साथ हमारे द्वारा साझा किए गए लिंक के लिए बुरा है। ;-(

लेकिन मैं इस उत्तर को कभी नहीं देता, क्योंकि यह आपकी जरूरत को पूरा करता है। (यदि नहीं, तो यह आपकी आवश्यकताओं को अद्यतन करने के लिए ट्रिगर हो सकता है, जो "एक अच्छी बात" (टीएम) भी होगा)।

संपादित : यदि एक सम्मिलित डेटाबेस अद्वितीय अवरोध को तोड़ देगा, तो चालक द्वारा रिले किए गए डेटाबेस स्तर पर एक अपवाद फेंक दिया जाता है। यह निश्चित रूप से एक विफलता के साथ, आपकी स्क्रिप्ट को रोक देगा। उस मामले को स्वीकार करने के लिए PHP में यह संभव होना चाहिए ...


1
मैंने सवाल पर स्पष्टीकरण जोड़ा - क्या आपका जवाब अभी भी लागू होता है?
वॉरेन

2
मेरा मानना ​​है कि यह करता है। एक अद्वितीय बाधा गलत आवेषण की विफलता का कारण बनेगी। नोट: आपको अपने कोड में इस विफलता से निपटना होगा, लेकिन यह काफी मानक है।
KLE

1
अभी के लिए मैं स्वीकार किए गए समाधान के साथ छड़ी करने जा रहा हूं - लेकिन आगे बढ़ने पर INSERT विफलताओं आदि से निपटने में ध्यान देगा क्योंकि ऐप बढ़ता है
वॉरेन

3
INSERT IGNOREमूल रूप से सभी त्रुटियों को चेतावनी में बदल देता है ताकि आपकी स्क्रिप्ट बाधित न हो। फिर आप कमांड के साथ कोई भी चेतावनी देख सकते हैं SHOW WARNINGS। और एक और महत्वपूर्ण नोट : अद्वितीय बाधाओं NULL मूल्यों के साथ काम नहीं करते हैं, यानी। row1 (1, NULL) और row2 (1, NULL) दोनों को सम्मिलित किया जाएगा (जब तक कि एक अन्य बाधा जैसे कि प्राथमिक कुंजी टूट न जाए)। दुर्भाग्य।
साइमन ईस्ट

18

यहां एक PHP फ़ंक्शन है जो केवल एक पंक्ति सम्मिलित करेगा यदि सभी निर्दिष्ट स्तंभ मान तालिका में पहले से मौजूद नहीं हैं।

  • यदि स्तंभों में से एक अलग है, तो पंक्ति को जोड़ा जाएगा।

  • यदि तालिका खाली है, तो पंक्ति जोड़ दी जाएगी।

  • यदि कोई पंक्ति मौजूद है जहाँ सभी निर्दिष्ट कॉलम में निर्दिष्ट मान हैं, तो पंक्ति को नहीं जोड़ा जाएगा।

    function insert_unique($table, $vars)
    {
      if (count($vars)) {
        $table = mysql_real_escape_string($table);
        $vars = array_map('mysql_real_escape_string', $vars);
    
        $req = "INSERT INTO `$table` (`". join('`, `', array_keys($vars)) ."`) ";
        $req .= "SELECT '". join("', '", $vars) ."' FROM DUAL ";
        $req .= "WHERE NOT EXISTS (SELECT 1 FROM `$table` WHERE ";
    
        foreach ($vars AS $col => $val)
          $req .= "`$col`='$val' AND ";
    
        $req = substr($req, 0, -5) . ") LIMIT 1";
    
        $res = mysql_query($req) OR die();
        return mysql_insert_id();
      }
    
      return False;
    }
    

उदाहरण उपयोग:

<?php
insert_unique('mytable', array(
  'mycolumn1' => 'myvalue1',
  'mycolumn2' => 'myvalue2',
  'mycolumn3' => 'myvalue3'
  )
);
?>

5
बहुत महंगा अगर आप सम्मिलन का एक बड़ा भार है।
иad Дьdulяңмaи

सच है, लेकिन अगर आपको विशिष्ट चेकअप जोड़ने की आवश्यकता है
चार्ल्स फॉरेस्ट

1
चेतावनी: mysql_* विस्तार को PHP 5.5.0 के रूप में दर्शाया गया है, और इसे PHP 7.0.0 के रूप में हटा दिया गया है। इसके बजाय, या तो mysqli या PDO_MySQL एक्सटेंशन का उपयोग किया जाना चाहिए। MySQL API चुनते समय आगे की सहायता के लिए MySQL API अवलोकन भी देखें ।
18

17
REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;

यदि रिकॉर्ड मौजूद है, तो इसे अधिलेखित कर दिया जाएगा; यदि यह अभी तक मौजूद नहीं है, तो इसे बनाया जाएगा।


10
REPLACEपंक्ति को हटा सकते हैं और फिर अद्यतन के बजाय सम्मिलित कर सकते हैं। इसका साइड इफेक्ट यह है कि अड़चनें अन्य ऑब्जेक्ट को हटा सकती हैं और ट्रिगर को निकाल दिया जाता है।
21

1
MySQL मैनुअल से: "REPLACE केवल तभी समझ में आता है जब किसी टेबल में PRIMARY KEY या UNIQUE इंडेक्स होता है। अन्यथा, यह INSERT के बराबर हो जाता है, क्योंकि यह निर्धारित करने के लिए कोई इंडेक्स का उपयोग नहीं किया जाता है कि नई पंक्ति दूसरी डुप्लिकेट करती है या नहीं।"
बर्निनलियो

16

निम्नलिखित आज़माएँ:

IF (SELECT COUNT(*) FROM beta WHERE name = 'John' > 0)
  UPDATE alfa SET c1=(SELECT id FROM beta WHERE name = 'John')
ELSE
BEGIN
  INSERT INTO beta (name) VALUES ('John')
  INSERT INTO alfa (c1) VALUES (LAST_INSERT_ID())
END

5
यह उत्तर दें StackOverflow पर निम्न-मूल्य हैं क्योंकि वे ओपी और भविष्य के हजारों शोधकर्ताओं को शिक्षित करने के लिए बहुत कम करते हैं। कृपया इस जवाब को संपादित करें कि समाधान कैसे काम करता है और यह एक अच्छा विचार क्यों है।
मिकमैकुसा

1
सही-मिलान वाले फ़ील्ड के मामले में सही समाधान कुंजी नहीं हैं ..!
सिंह

6

ऐसे कई उत्तर हैं जो इस बात को हल करते हैं कि यदि आपके पास कोई UNIQUEइंडेक्स है जिसे आप के साथ ON DUPLICATE KEYया उसके खिलाफ जांच कर सकते हैं INSERT IGNORE। यह हमेशा मामला नहीं होता है, और जैसा UNIQUEकि एक लंबाई की बाधा (1000 बाइट्स) होती है, आप इसे बदलने में सक्षम नहीं हो सकते हैं। उदाहरण के लिए, मुझे वर्डप्रेस ( wp_postmeta) में मेटाडेटा के साथ काम करना था ।

मैंने अंततः इसे दो प्रश्नों के साथ हल किया:

UPDATE wp_postmeta SET meta_value = ? WHERE meta_key = ? AND post_id = ?;
INSERT INTO wp_postmeta (post_id, meta_key, meta_value) SELECT DISTINCT ?, ?, ? FROM wp_postmeta WHERE NOT EXISTS(SELECT * FROM wp_postmeta WHERE meta_key = ? AND post_id = ?);

प्रश्न 1 में एक नियमित UPDATEक्वेरी है जिसका कोई प्रभाव नहीं है जब प्रश्न में डेटासेट नहीं है। क्वेरी 2 एक ऐसा है INSERTजो एक पर निर्भर करता है NOT EXISTS, यानी INSERTकेवल तब निष्पादित किया जाता है जब डाटासेट मौजूद नहीं होता है।


2

ध्यान देने योग्य बात यह है कि INSERT IGNORE अभी भी प्राथमिक कुंजी को बढ़ाएगा चाहे वह कथन एक सफलता हो या सामान्य INSERT की तरह ही नहीं।

यह आपके प्राथमिक कुंजी में अंतराल का कारण होगा जो एक प्रोग्रामर को मानसिक रूप से अस्थिर बना सकता है। या यदि आपका एप्लिकेशन खराब तरीके से डिज़ाइन किया गया है और सही वृद्धिशील प्राथमिक कुंजियों पर निर्भर करता है, तो यह सिरदर्द बन सकता है।

में देखें innodb_autoinc_lock_mode = 0(सर्वर सेटिंग, और एक मामूली प्रदर्शन हिट के साथ आता है), या यह सुनिश्चित करने के लिए पहले एक चयन का उपयोग करें कि आपकी क्वेरी विफल नहीं होगी (जो प्रदर्शन हिट और अतिरिक्त कोड के साथ भी आती है)।


"आपकी प्राथमिक कुंजी में अंतराल" क्यों होगा - यहां तक ​​कि संभावित रूप से - "एक प्रोग्रामर को मानसिक रूप से अस्थिर बनाएं"? प्राथमिक कुंजी में हर समय अंतराल होता है - हर बार जब आप एक रिकॉर्ड हटाते हैं, उदाहरण के लिए।
वॉरेन

एक साथ शुरू SELECTहार सिर्फ सौंपने बंद का एक बड़ा बैच का पूरा उद्देश्य INSERTरों और डुप्लिकेट के बारे में चिंता नहीं करना चाहता।
वॉरेन

2

ज्ञात प्राथमिक कुंजी के बिना अपडेट करें या डालें

यदि आपके पास पहले से ही एक अद्वितीय या प्राथमिक कुंजी है, तो INSERT INTO ... ON DUPLICATE KEY UPDATE ...या तो के साथ अन्य उत्तर या REPLACE INTO ...ठीक काम करना चाहिए (ध्यान दें कि मौजूद होने पर हटाए जाने में बदल जाता है और फिर आवेषण - इस प्रकार आंशिक रूप से मौजूदा मूल्यों को अपडेट नहीं करता है)।

लेकिन अगर आपके पास मूल्य हैं some_column_idऔर some_type, जिनके संयोजन को अद्वितीय माना जाता है। और some_valueयदि आप मौजूद हैं तो अपडेट करना चाहते हैं , अगर मौजूद नहीं हैं तो डालें। और आप इसे केवल एक क्वेरी में करना चाहते हैं (लेनदेन का उपयोग करने से बचने के लिए)। यह एक समाधान हो सकता है:

INSERT INTO my_table (id, some_column_id, some_type, some_value)
SELECT t.id, t.some_column_id, t.some_type, t.some_value
FROM (
    SELECT id, some_column_id, some_type, some_value
    FROM my_table
    WHERE some_column_id = ? AND some_type = ?
    UNION ALL
    SELECT s.id, s.some_column_id, s.some_type, s.some_value
    FROM (SELECT NULL AS id, ? AS some_column_id, ? AS some_type, ? AS some_value) AS s
) AS t
LIMIT 1
ON DUPLICATE KEY UPDATE
some_value = ?

मूल रूप से, क्वेरी इस तरह निष्पादित होती है (जितनी दिख सकती है उससे कम जटिल):

  • WHEREक्लॉज मैच के माध्यम से एक मौजूदा पंक्ति का चयन करें ।
  • संघ जो एक संभावित नई पंक्ति (तालिका s) के साथ परिणत होता है , जहां स्तंभ मान स्पष्ट रूप से दिए गए हैं (s.id NULL है, इसलिए यह एक नया ऑटो-इन्क्रीमेंट पहचानकर्ता उत्पन्न करेगा)।
  • यदि एक मौजूदा पंक्ति पाई जाती है, तो तालिका से संभावित नई पंक्ति sको छोड़ दिया जाता है (टेबल पर लिमिट 1 के कारण t), और यह हमेशा एक ट्रिगर ON DUPLICATE KEYहोगा UPDATEजो some_valueस्तंभ होगा ।
  • यदि एक मौजूदा पंक्ति नहीं मिली है, तो संभावित नई पंक्ति डाली गई है (जैसा कि तालिका द्वारा दिया गया है s)।

नोट: किसी रिलेशनल डेटाबेस की प्रत्येक तालिका में कम से कम एक प्राथमिक ऑटो-वृद्धि idकॉलम होना चाहिए । यदि आपके पास यह नहीं है, तो इसे जोड़ें, तब भी जब आपको पहली नजर में इसकी आवश्यकता न हो। यह "चाल" के लिए निश्चित रूप से आवश्यक है।


कई अन्य उत्तरदाताओं ने एक INSERT INTO ... SELECT FROMप्रारूप दिया है। आपने भी क्यों किया?
वॉरेन

2
@warren या तो आपने मेरा उत्तर नहीं पढ़ा, आप इसे नहीं समझते, या मैंने इसे ठीक से नहीं समझाया। किसी भी मामले में, मुझे निम्नलिखित पर जोर देना चाहिए: यह सिर्फ एक नियमित INSERT INTO... SELECT FROM...समाधान नहीं है। कृपया मुझे एक उत्तर के लिंक का उल्लेख करें जो कि समान है, यदि आप इसे पा सकते हैं तो मैं इस उत्तर को हटा दूंगा, अन्यथा आप मेरे उत्तर (डील?) को अपग्रेड करें। यह सत्यापित करना सुनिश्चित करें कि आप जिस लिंक को लिंक करने जा रहे हैं वह केवल 1 क्वेरी (अपडेट + इंसर्ट के लिए) का उपयोग करता है, कोई लेन-देन नहीं करता है, और स्तंभों के किसी भी संयोजन को लक्षित करने में सक्षम है जो अद्वितीय हैं (इसलिए अलग से कॉलम नहीं करते हैं अद्वितीय होने की जरूरत है)।
यति
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.