MySQL में, क्या मैं एक ही तालिका में सम्मिलित करने के लिए एक पंक्ति की प्रतिलिपि बना सकता हूँ?


162
insert into table select * from table where primarykey=1

मैं एक ही तालिका में सम्मिलित करने के लिए एक पंक्ति की प्रतिलिपि बनाना चाहता हूं (यानी, मैं तालिका में एक मौजूदा पंक्ति की नकल करना चाहता हूं) लेकिन मैं "चयन" के बाद सभी कॉलमों को सूचीबद्ध किए बिना ऐसा करना चाहता हूं, क्योंकि यह तालिका है बहुत सारे कॉलम।

लेकिन जब मैं ऐसा करता हूं, मुझे त्रुटि मिलती है:

कुंजी 1 के लिए डुप्लिकेट प्रविष्टि 'xxx'

मैं इसे रिकॉर्ड करने के लिए एक अस्थायी कंटेनर के रूप में समान कॉलम के साथ एक और तालिका बनाकर संभाल सकता हूं:

create table oldtable_temp like oldtable;
insert into oldtable_temp select * from oldtable where key=1;
update oldtable_tem set key=2;
insert into oldtable select * from oldtable where key=2;

क्या इसे हल करने का कोई सरल तरीका है?


मेरे पास कुंजी के लिए हार्ड-कोडित मूल्यों के बारे में एक टिप्पणी है। मैं कुछ max(oldtable.id) + oldtable_temp.keyइस तरह से करूँगा कि मैं सुनिश्चित करूँ कि आईडी वृद्धि और अद्वितीय हैं।
लड़का मोगरेबी


@OrganicAdvocate के पास इस प्रश्न से अधिक उत्तर और अधिक विचार हैं
Drew

जवाबों:


189

मैंने कुछ बदलावों के साथ लियोनार्ड चैलिस की तकनीक का उपयोग किया:

CREATE TEMPORARY TABLE tmptable_1 SELECT * FROM table WHERE primarykey = 1;
UPDATE tmptable_1 SET primarykey = NULL;
INSERT INTO table SELECT * FROM tmptable_1;
DROP TEMPORARY TABLE IF EXISTS tmptable_1;

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

यदि आप सुपर-सुनिश्चित होना चाहते हैं कि आपको सम्मिलित करने के लिए केवल एक पंक्ति मिल रही है, तो आप INSERT INTAL लाइन के अंत में LIMIT 1 जोड़ सकते हैं।

ध्यान दें कि मैंने प्राथमिक अस्थायी मान (इस मामले में 1) को अपने अस्थायी तालिका नाम में जोड़ा है।


3
यह समाधान सही है (वोट पाने के लिए कुछ अन्य लोगों के विपरीत) इसमें यह MySQL को प्राथमिक कुंजी मान चुनने की अनुमति देता है।
Jan Hettich

1
हालांकि असंगत अस्थायी तालिका नामों ( tmptable_1बनाम tmptable) के कारण बिल्कुल काम नहीं करेगा
कीरन टली

9
एक प्राथमिक कुंजी कैसे अशक्त हो सकती है?
इमरान शफकत

5
यदि यह शून्य है, तो इसे डालने पर स्वचालित रूप से अगला AI नंबर असाइन हो जाता है।
ग्रिम ...

3
IMRAN - आप अच्छी तरह से पूछ सकते हैं। मैंने सोचा कि शायद अस्थायी तालिका के आईडी फ़ील्ड को स्वचालित रूप से पीके नहीं बनाया गया था (मुझे पूरा यकीन है कि SQL सर्वर इन परिस्थितियों में ऐसा नहीं करता है) लेकिन यह है। मुझे टटरटेबल tmptable_1 का उपयोग करने की आवश्यकता थी। MODIFY primarykeyINT NULL; समाधान कार्य करने के लिए पहली पंक्ति के बाद
डीजेडेव

61

अपडेट 07/07/2014 - ग्रिम द्वारा मेरे उत्तर पर आधारित उत्तर ... , एक बेहतर समाधान है क्योंकि यह नीचे दिए गए मेरे समाधान में सुधार करता है, इसलिए मैं इसका उपयोग करने का सुझाव दूंगा।

आप निम्नलिखित सिंटैक्स वाले सभी कॉलमों को सूचीबद्ध किए बिना ऐसा कर सकते हैं:

CREATE TEMPORARY TABLE tmptable SELECT * FROM table WHERE primarykey = 1;
UPDATE tmptable SET primarykey = 2 WHERE primarykey = 1;
INSERT INTO table SELECT * FROM tmptable WHERE primarykey = 2;

आप प्राथमिक कुंजी को दूसरे तरीके से बदलने का निर्णय ले सकते हैं।


16
यह मूल रूप से एक ही समाधान है क्योंकि ओपी ने पहले से ही अपनी समस्या के लिए प्रदान किया था, हालांकि वास्तविक अस्थायी तालिकाओं के साथ, और थोड़ा क्लीनर पैटर्न बनाते हैं। मुझे लगता है कि ओपी ने जो पहले से उपयोग कर रहे थे उससे बेहतर दृष्टिकोण के लिए कहा , न कि उनके मौजूदा सिंटैक्स की सफाई। वास्तव में इसके लिए सभी upvotes को न समझें।
सेप्टर

धन्यवाद। गतिशील समारोह के साथ इसकी अच्छी तरह से चल रहा है
सोनल खूंट

क्या यह प्रक्रिया समाप्त हो जाने के बाद tmptable को हटाना आवश्यक है?
एसएसएच यह

"डिफ़ॉल्ट रूप से MySQL द्वारा सभी अस्थायी तालिकाओं को हटा दिया जाता है जब आपका डेटाबेस कनेक्शन समाप्त हो जाता है। फिर भी आप उन्हें बीच में हटाना चाहते हैं तब आप DROP TABLE कमांड जारी करके ऐसा करते हैं।" यहाँ और अधिक
लियोनार्डकैल्ली

यह देखते हुए कि आपने इसे बनाया है tmptable, आपको WHERE primarykey = 2अंतिम पंक्ति के लिए भी कथन जोड़ने की आवश्यकता नहीं है। (यानी, बस INSERT INTO table SELECT * FROM tmptable।)
मार्कस

42

मैं मान रहा हूँ कि आप नया रिकॉर्ड एक नया primarykeyचाहते हैं? अगर primarykeyहै AUTO_INCREMENTतो बस यही करें:

INSERT INTO table (col1, col2, col3, ...)
SELECT col1, col2, col3, ... FROM table
  WHERE primarykey = 1

... जहां col1, col2, col3, ...मेज के सभी स्तंभों को छोड़कर है primarykey

यदि यह एक AUTO_INCREMENTकॉलम नहीं है और आप primarykeyइसके लिए नए मूल्य का चयन करने में सक्षम होना चाहते हैं :

INSERT INTO table (primarykey, col2, col3, ...)
SELECT 567, col2, col3, ... FROM table
  WHERE primarykey = 1

... जहां 567के लिए नए मूल्य है primarykey


41
जब यह प्रश्न को अनदेखा करता है तो इसे 7 बार कैसे उतारा जाता है? ... लेकिन मुझे "चयन" के बाद सभी कॉलमों की सूची नहीं चाहिए, क्योंकि इस तालिका में बहुत अधिक कॉलम हैं ...
लियोनार्डकैल्सिस

7
-1 क्योंकि यह वही है जो ओपी बचना चाहता है। प्रश्न पढ़ें, या कम से कम एक उत्तर दें जैसे "यह एकमात्र संभव तरीका है"।
देवियो १

5
क्योंकि कभी-कभी सवाल ही गलत होता है। :) सामग्री में फेरबदल के बिना डुप्लिकेटिंग पंक्तियों में अतिरेक बढ़ जाता है। यदि संभव हो तो अतिरेक को कम करने के लिए डेटाबेस संरचना को बदलना चाहिए।
तोरबन

5
सिर्फ इसलिए कि यह सामान्य प्रथाओं के तहत सही नहीं है, यह गलत नहीं है। जब मानक सर्वोत्तम प्रथाएं लागू नहीं होती हैं तो बहुत बार होती हैं। उदाहरण: डेटाबेस दस्तावेजों का प्रतिनिधित्व करता है और उपयोगकर्ता को परिवर्तन करने से पहले दस्तावेज़ की एक प्रति को संरक्षित करने की आवश्यकता होती है।
ima747

6
चूँकि आप इस पेज पर ठीक उसी तरह से
उतरना चाह सकते हैं

13

आपके पास लगभग यह आपकी पहली क्वेरी के साथ है जिसमें आपको केवल कॉलम निर्दिष्ट करने की आवश्यकता है, इस तरह आप अपनी प्राथमिक कुंजी को सम्मिलित रूप से बाहर कर सकते हैं जो आपके द्वारा संभावित रूप से एक नई प्राथमिक कुंजी बनाने के लिए मेज पर मौजूद ऑटो-वेतन वृद्धि को लागू करेगा। प्रवेश।

उदाहरण के लिए इसे बदलें:

insert into table select * from table where primarykey=1

इसके लिए:

INSERT INTO table (col1, col2, col3) 
SELECT col1, col2, col3 
FROM table 
WHERE primarykey = 1

बस INSERT के लिए या क्वेरी के SELECT भागों के लिए कॉलम सूची में प्राइमरी कॉलम को शामिल न करें।


1
क्या चयन विवरण के माध्यम से अधिकांश स्तंभों को खींचने का एक तरीका है, लेकिन सम्मिलित कमांड में उनमें से एक को मैन्युअल रूप से अपडेट करें? जैसे insert into table ("val1", col2, col3) select col2, col3 from table where primarykey = 1या कुछ इसी तरह?
anon58192932

1
मिल गया! एक पंक्ति से मानों की प्रतिलिपि बनाएँ, लेकिन सम्मिलित विवरण में अपने स्वयं के मूल्यों को जोड़ें: stackoverflow.com/questions/23971078/…
anon58192932

1
क्षमा करें, बस आपके प्रश्नों के बारे में सूचित किया गया था, खुशी है कि आपने इसे पाया, यह वास्तव में एक तरीका है।
ब्रैडेन ब्लैक ऑक्ट

9

आप तालिका को डंप करने की कोशिश कर सकते हैं, सम्मिलित कमांड को खोज सकते हैं और उसे संपादित कर सकते हैं:

mysqldump -umyuser -p mydatabase --skip-extended-insert mytable > outfile.sql

--skip-extended-insertआप प्रति पंक्ति एक डालने आदेश देता है। तब आप अपने पसंदीदा पाठ संपादक में पंक्ति पा सकते हैं, कमांड निकाल सकते हैं और प्राथमिक कुंजी को "डिफ़ॉल्ट" में बदल सकते हैं।


2
+1 में से यह एक अच्छा "बॉक्स के बाहर" दृष्टिकोण है जो वास्तव में कुछ परिस्थितियों में रन-टाइम के बाहर सहायक हो सकता है। लेकिन मुख्य रूप से यह पहला उत्तर है जो वास्तव में ओपी के प्रश्न को संबोधित करता है और ओपी द्वारा पहले से ही प्रदान किए गए समाधान को केवल वाक्यविन्यास नहीं करता है।
सेप्टर

6

यह प्रक्रिया मानती है कि:

  • आपके पास _duplicate_temp_table नहीं है
  • आपकी प्राथमिक कुंजी int है
  • आपके पास तालिका बनाने के लिए पहुँच है

बेशक यह सही नहीं है, लेकिन निश्चित रूप से (शायद सबसे) मामलों में यह काम करेगा।

DELIMITER $$
CREATE PROCEDURE DUPLICATE_ROW(copytable VARCHAR(255), primarykey VARCHAR(255), copyid INT, out newid INT)
BEGIN
        DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @error=1;
        SET @temptable = '_duplicate_temp_table';
        SET @sql_text = CONCAT('CREATE TABLE ', @temptable, ' LIKE ', copytable);
        PREPARE stmt FROM @sql_text;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        SET @sql_text = CONCAT('INSERT INTO ', @temptable, ' SELECT * FROM ', copytable, ' where ', primarykey,'=', copyid);
        PREPARE stmt FROM @sql_text;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        SET @sql_text = CONCAT('SELECT max(', primarykey, ')+1 FROM ', copytable, ' INTO @newid');
        PREPARE stmt FROM @sql_text;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        SET @sql_text = CONCAT('UPDATE ', @temptable, ' SET ', primarykey, '=@newid');
        PREPARE stmt FROM @sql_text;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        SET @sql_text = CONCAT('INSERT INTO ', copytable, ' SELECT * FROM ', @temptable, '');
        PREPARE stmt FROM @sql_text;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        SET @sql_text = CONCAT('DROP TABLE ', @temptable);
        PREPARE stmt FROM @sql_text;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        SELECT @newid INTO newid;
END $$
DELIMITER ;

CALL DUPLICATE_ROW('table', 'primarykey', 1, @duplicate_id);
SELECT @duplicate_id;

1
+1 ने इसकी पुष्टि नहीं की, worksलेकिन यह दृष्टिकोण ध्वनि है, और मूल्य का है क्योंकि यह यहां अद्वितीय है और वास्तव में ओपी के प्रश्न को संबोधित करता है।
सेप्टस्टर

5

यह कुछ रचनात्मकता के साथ प्राप्त किया जा सकता है:

SET @sql = CONCAT('INSERT INTO <table> SELECT null, 
    ', (SELECT GROUP_CONCAT(COLUMN_NAME) 
    FROM information_schema.columns 
    WHERE table_schema = '<database>' 
    AND table_name = '<table>' 
    AND column_name NOT IN ('id')), ' 
from <table> WHERE id = <id>');  

PREPARE stmt1 FROM @sql;
EXECUTE stmt1;

इससे नई पंक्ति में चयनित पंक्ति से आईडी के बजाय एक ऑटो इंक्रीमेंट आईडी प्राप्त होगी।


यह स्वीकृत उत्तर होना चाहिए!
फेलिप डेसिडेराटी

5

यदि आपकी तालिका का मुख्य कुंजी क्षेत्र एक ऑटो वेतन वृद्धि क्षेत्र है, तो आप कॉलम के साथ क्वेरी का उपयोग कर सकते हैं। उदाहरण के लिए, आपके नाम test_tblकी तालिका में 3 फ़ील्ड हैं id, name, ageidप्राथमिक कुंजी फ़ील्ड और ऑटो इंक्रीमेंट है, इसलिए आप पंक्ति को डुप्लिकेट करने के लिए निम्न क्वेरी का उपयोग कर सकते हैं:

INSERT INTO `test_tbl` (`name`,`age`) SELECT `name`,`age` FROM `test_tbl`;

इस क्वेरी के परिणामस्वरूप प्रत्येक पंक्ति को डुप्लिकेट किया जा रहा है।


यदि आपकी तालिका का मुख्य कुंजी क्षेत्र एक ऑटो वेतन वृद्धि क्षेत्र नहीं है, तो आप निम्न विधि का उपयोग कर सकते हैं:

INSERT INTO `test_tbl` (`id`,`name`,`age`)
  SELECT 20,`name`,`age` FROM `test_tbl` WHERE id = 19;

इस क्वेरी का परिणाम id=19सम्मिलित रूप से एक डुप्लिकेट पंक्ति है id=20


यही कारण है कि है सबसे अच्छा जवाब है, मामला बिल्कुल स्पष्ट है: INSERT INTO tableName( fieldName1, fieldName2, fieldName3) का चयन करें fieldName1, fieldName2, fieldName3से tableNameजहां 1 (एक ही बार में उन सभी को कॉपी करने के लिए)
jakubplus

दूसरा - यह उत्तर संक्षिप्त है और वास्तव में एक पंक्ति की "नकल" कर रहा है।
user37309

4

अद्यतन फ़ील्ड और ऑटो वेतन वृद्धि मूल्य के साथ क्लोन पंक्ति

CREATE TEMPORARY TABLE `temp` SELECT * FROM `testing` WHERE id = 14;

UPDATE `temp` SET id = (SELECT id FROM testing ORDER by id DESC LIMIT 1
 )+1, user_id = 252 ,policy_no = "mysdddd12" where id = 14;

INSERT INTO `testing` SELECT * FROM `temp`;

DROP TEMPORARY TABLE IF EXISTS `temp`;

@Torben कृपया प्रश्न के बाईं ओर टिक की जाँच करें (इसे स्वीकार किए गए अनुसार चिह्नित करें) ताकि सभी को पता चल जाए कि यह आपके लिए काम कर रहा है।
होसेएनजेएफ

3

निम्नलिखित में से कुछ को इस साइट से हटा दिया गया था। यह वही है जो मैंने किसी भी फ़ील्ड के किसी तालिका में रिकॉर्ड की नकल करने के लिए किया था:

यह भी माना जाता है कि आपके पास तालिका की शुरुआत में एक AI फ़ील्ड है

function duplicateRow( $id = 1 ){
dbLink();//my db connection
$qColumnNames = mysql_query("SHOW COLUMNS FROM table") or die("mysql error");
$numColumns = mysql_num_rows($qColumnNames);

for ($x = 0;$x < $numColumns;$x++){
$colname[] = mysql_fetch_row($qColumnNames);
}

$sql = "SELECT * FROM table WHERE tableId = '$id'";
$row = mysql_fetch_row(mysql_query($sql));
$sql = "INSERT INTO table SET ";
for($i=1;$i<count($colname)-4;$i++){//i set to 1 to preclude the id field
//we set count($colname)-4 to avoid the last 4 fields (good for our implementation)
$sql .= "`".$colname[$i][0]."`  =  '".$row[$i]. "', ";
}
$sql .= " CreateTime = NOW()";// we need the new record to have a new timestamp
mysql_query($sql);
$sql = "SELECT MAX(tableId) FROM table";
$res = mysql_query($sql);
$row = mysql_fetch_row($res);
return $row[0];//gives the new ID from auto incrementing
}

3

मैंने ग्रिम की तकनीक का उपयोग थोड़े बदलाव के साथ किया है: यदि कोई व्यक्ति इस क्वेरी की तलाश कर रहा है क्योंकि प्राथमिक कुंजी समस्या के कारण एक साधारण क्वेरी नहीं कर सकता है:

INSERT INTO table SELECT * FROM table WHERE primakey=1;

मेरे MySql 5.6.26 स्थापित करने के साथ, कुंजी अशक्त नहीं है और एक त्रुटि उत्पन्न करता है:

#1048 - Column 'primakey' cannot be null 

इसलिए अस्थायी तालिका बनाने के बाद मैं प्राथमिक कुंजी को एक अशक्त बना देता हूं।

CREATE TEMPORARY TABLE tmptable_1 SELECT * FROM table WHERE primarykey = 1;
ALTER TABLE tmptable_1 MODIFY primarykey int(12) null;
UPDATE tmptable_1 SET primarykey = NULL;
INSERT INTO table SELECT * FROM tmptable_1;
DROP TEMPORARY TABLE IF EXISTS tmptable_1;

वैकल्पिक रूप से mariadb / mysql के नए संस्करणों में PrimaryKey को 0 पर सेट किया जा सकता है, जो डालने पर ऑटो-इंक्रीमेंट को काम करने की अनुमति देता है।
आश्रयदीपेरे

2

मुझे इसमें देर हो सकती है, लेकिन मेरे पास एक समान समाधान है जो मेरे लिए काम करता है।

 INSERT INTO `orders` SELECT MAX(`order_id`)+1,`container_id`, `order_date`, `receive_date`, `timestamp` FROM `orders` WHERE `order_id` = 1

इस तरह मुझे एक अस्थायी तालिका और आदि बनाने की आवश्यकता नहीं है। जैसा कि पंक्ति को उसी तालिका में कॉपी Max(PK)+1किया जाता है , फ़ंक्शन आसानी से उपयोग किया जा सकता है।

मैं इस प्रश्न के समाधान की तलाश में आया था (सिंटैक्स भूल गया था) और मैंने अपना प्रश्न बना लिया। मजेदार है कि चीजें कुछ समय के लिए कैसे काम करती हैं।

सादर


2

यदि प्राथमिक कुंजी ऑटो वृद्धि है, तो प्राथमिक कुंजी को छोड़कर प्रत्येक फ़ील्ड निर्दिष्ट करें।

INSERT INTO table(field1,field2,field3) SELECT (field1,field2,field3) FROM table WHERE primarykey=1


2

मैंने @ LeonardChallis के समाधान को अपडेट किया क्योंकि यह मेरे लिए दूसरों के रूप में काम नहीं करता था। मैंने WHEREक्लॉज़ को हटा दिया और SET primaryKey = 0टेम्प टेबल में इसलिए MySQL ऑटो-इन्क्रीमेंट्स प्राइमरीकेय

CREATE TEMPORARY TABLE tmptable SELECT * FROM myTable;
UPDATE tmptable SET primaryKey = 0;
INSERT INTO myTable SELECT * FROM tmptable;

यह निश्चित रूप से तालिका में सभी पंक्तियों की नकल करने के लिए है।


2

मैं नीचे का उपयोग करेंगे,

insert into ORDER_ITEM select * from ORDER_ITEM where ITEM_NUMBER =123;

1
यदि ITEM_NUMBER आपकी प्राथमिक कुंजी है, जो इस स्थिति में होने की संभावना है, तो यह काम नहीं करता है।
बिली तीर्थयात्रा

2

मैंने अपने कोह डेटाबेस में बारकोड कॉलम में 'C' उपसर्ग के साथ डुप्लिकेट आइटम सम्मिलित करने के लिए उपयोग किया :

INSERT INTO items (`biblionumber`, `biblioitemnumber`, `barcode`, `dateaccessioned` ) SELECT `biblionumber`, `biblioitemnumber`,  CONCAT('C',`barcode`), `dateaccessioned` FROM `items` WHERE barcode='14832';

1

मुझे बस यही करना था और यह मेरा मैनुअल समाधान था:

  1. में phpmyadmin , पंक्ति आप प्रतिलिपि करना चाहते हैं की जाँच
  2. क्वेरी परिणाम संचालन के नीचे सबसे नीचे 'निर्यात' पर क्लिक करें
  3. अगले पेज पर 'Save as file' पर क्लिक करें और फिर 'Go' पर क्लिक करें
  4. पाठ संपादक के साथ निर्यात की गई फ़ाइल खोलें, प्राथमिक फ़ील्ड का मान ढूंढें और इसे कुछ अद्वितीय में बदलें।
  5. Phpmyadmin में वापस 'आयात' टैब पर क्लिक करें , आयात करने के लिए फ़ाइल का पता लगाएँ। ब्राउज़ के तहत .ql फ़ाइल , 'गो' पर क्लिक करें और डुप्लिकेट पंक्ति सम्मिलित की जानी चाहिए।

यदि आप नहीं जानते हैं कि प्राथमिक क्षेत्र क्या है, तो अपने phpmyadmin पृष्ठ पर वापस देखें , 'संरचना' टैब पर क्लिक करें और 'अनुक्रमित' के नीचे पृष्ठ के निचले भाग पर यह आपको दिखाएगा कि किस 'फ़ील्ड' में 'Keyname' है मूल्य 'प्राथमिक'

एक तरह से चारों ओर एक लंबा रास्ता है, लेकिन अगर आप मार्कअप से निपटना नहीं चाहते हैं और आपको वहां जाने के लिए बस एक पंक्ति को डुप्लिकेट करने की आवश्यकता है।


अच्छा, बॉक्स के बाहर तरह से सेशन का जवाब देता है। सभी मामलों के लिए काम नहीं करता है, जाहिर है, जैसे कि बूँद और भू-स्थानिक डेटा, लेकिन खींचने में बहुत आसान है और उन विषम गेंद परिवर्तनों के लिए काम करता है।
Strixy

1

यह समाधान ऊपर दिखाए गए कार्यों के लिए चयनित पंक्तियों के लिए भी सही है। उदाहरण के लिए, मैं अपने nice2work परियोजना के लिए प्रदर्शन पंक्तियाँ बना रहा हूं, और यह एकदम सही है।

CREATE TEMPORARY TABLE tmptable SELECT * FROM myTable WHERE id=500;
UPDATE tmptable SET id = 0;
UPDATE some fields I need to change
INSERT INTO myTable SELECT * FROM tmptable;
DROP TABLE tmptable;

//  You can use this same also directly into your code like (PHP Style)
$sql = "CREATE TEMPORARY TABLE tmptable SELECT * FROM myTable WHERE id=500;
UPDATE tmptable SET id = 0;
UPDATE some fields I need to change
INSERT INTO myTable SELECT * FROM tmptable;DROP TABLE tmptable;";

0

नेक्रोपोस्ट के लिए क्षमा करें, लेकिन यह वही है जो मैंने Google के साथ किया था और जब से मुझे यह मददगार मिला लेकिन समस्याग्रस्त मैं किसी और के लिए एक महत्वपूर्ण संशोधन का योगदान करना चाहता था जो इसे खोदता है।

सबसे पहले, मैं SQL सर्वर का उपयोग कर रहा हूं, MySQL नहीं, लेकिन मुझे लगता है कि इसे इसी तरह काम करना चाहिए। मैंने लियोनार्ड चैलिस के समाधान का उपयोग किया क्योंकि यह सबसे सरल था और आवश्यकता को पूरा करता था, हालांकि इसके साथ एक समस्या है - यदि आप केवल पीके लेते हैं और इसे 1 से बढ़ाते हैं तो क्या होता है यदि आपने प्रश्न में पंक्ति जोड़ दिए जाने के बाद से अन्य रिकॉर्ड जोड़े हैं। । मैंने तय किया कि सिस्टम को पीके के ऑटोइन्क्रिमेंटिंग को संभालने के लिए सबसे अच्छा है, इसलिए मैंने निम्नलिखित कार्य किया:

SELECT * INTO #tmpTable FROM Table WHERE primarykey = 1
--Optionally you can modify one or more fields here like this: 
--UPDATE #tmpTable SET somefield = newData
ALTER TABLE #tmpTable DROP COLUMN TicketUpdateID
INSERT INTO Tickets SELECT * FROM #tmpTable
DROP TABLE #tmpTable

मेरा मानना ​​है कि यह MySQL में इसी तरह काम करेगा, लेकिन मैं इसका परीक्षण नहीं कर सकता, क्षमा करें


1
पूरी तरह से बकवाओं का जवाब
असाद्यार्चन

0

मुझे पता है कि यह एक पुराना सवाल है, लेकिन यहाँ एक और समाधान है:

यह मुख्य तालिका में एक पंक्ति को डुप्लिकेट करता है, यह मानते हुए कि प्राथमिक कुंजी ऑटो-इन्क्रीमेंट है, और नए मुख्य टेबल आईडी के साथ लिंक्ड-टेबल डेटा की प्रतियां बनाता है।

कॉलम नाम प्राप्त करने के लिए अन्य विकल्प:
-SOW COLUMNS FROM tablename; (कॉलम नाम: फ़ील्ड)
-DESCRIBE tablename (कॉलम नाम: फ़ील्ड)
-SELECT column_name से जानकारी_schema.columns जहां टेबल_नाम = 'tablename' (कॉलम नाम: column_name

//First, copy main_table row
$ColumnHdr='';
$Query="SHOW COLUMNS FROM `main_table`;";
$Result=Wrappedmysql_query($Query,$link,__FILE__,__LINE__);
while($Row=mysql_fetch_array($Result))
{
    if($Row['Field']=='MainTableID')     //skip main table id in column list
        continue;
    $ColumnHdr.=",`" . $Row['Field'] . "`";
}
$Query="INSERT INTO `main_table` (" . substr($ColumnHdr,1) . ")
        (SELECT " . substr($ColumnHdr,1) . " FROM `main_table`
            WHERE `MainTableID`=" . $OldMainTableID . ");";
$Result=Wrappedmysql_query($Query,$link,__FILE__,__LINE__);
$NewMainTableID=mysql_insert_id($link);

//Change the name (assumes a 30 char field)
$Query="UPDATE `main_table` SET `Title`=CONCAT(SUBSTRING(`Title`,1,25),' Copy') WHERE `MainTableID`=" . $NewMainTableID . ";";
$Result=Wrappedmysql_query($Query,$link,__FILE__,__LINE__);

//now copy in the linked tables
$TableArr=array("main_table_link1","main_table_link2","main_table_link3");
foreach($TableArr as $TableArrK=>$TableArrV)
{
    $ColumnHdr='';
    $Query="SHOW COLUMNS FROM `" . $TableArrV . "`;";
    $Result=Wrappedmysql_query($Query,$link,__FILE__,__LINE__);
    while($Row=mysql_fetch_array($Result))
    {
        if($Row['Field']=='MainTableID')     //skip main table id in column list, re-added in query
            continue;
        if($Row['Field']=='dbID')    //skip auto-increment,primary key in linked table
            continue;
        $ColumnHdr.=",`" . $Row['Field'] . "`";
    }

    $Query="INSERT INTO `" . $TableArrV . "` (`MainTableID`," . substr($ColumnHdr,1) . ")
            (SELECT " . $NewMainTableID . "," . substr($ColumnHdr,1) . " FROM `" . $TableArrV . "`
             WHERE `MainTableID`=" . $OldMainTableID . ");";
    $Result=Wrappedmysql_query($Query,$link,__FILE__,__LINE__);
}

0

मैक्स 233 निश्चित रूप से सही रास्ते पर था, कम से कम स्वप्रतिरक्षण मामले के लिए। हालाँकि, ALTER TABLE न करें। बस NULL के लिए अस्थायी तालिका में ऑटो-इन्क्रीमेंट फ़ील्ड सेट करें। यह एक त्रुटि प्रस्तुत करेगा, लेकिन अस्थायी तालिका में सभी क्षेत्रों के निम्नलिखित INSERT होगा और NULL ऑटो फ़ील्ड एक अद्वितीय मान प्राप्त करेगा।


0

एक तालिका बनाएं

    CREATE TABLE `sample_table` (
       `sample_id` INT(10) unsigned NOT NULL AUTO_INCREMENT,
       `sample_name` VARCHAR(255) NOT NULL,
       `sample_col_1` TINYINT(1) NOT NULL,
       `sample_col_2` TINYINT(2) NOT NULL,

      PRIMARY KEY (`sample_id`),
      UNIQUE KEY `sample_id` (`sample_id`)

    ) ENGINE='InnoDB' DEFAULT CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

एक पंक्ति डालें

INSERT INTO `sample_table`
   VALUES(NULL, 'sample name', 1, 2);

क्लोन पंक्ति ऊपर डालें

INSERT INTO `sample_table`
   SELECT 
    NULL AS `sample_id`, -- new AUTO_INCREMENT PRIMARY KEY from MySQL
    'new dummy entry' AS `sample_name`,  -- new UNIQUE KEY from you
    `sample_col_1`, -- col from old row
    `sample_col_2` -- col from old row
   FROM `sample_table`
   WHERE `sample_id` = 1;

परीक्षा

SELECT * FROM `sample_table`;

नोट: यदि आपको NULL के बजाय त्रुटि (# 1048) का उपयोग हो रहा है
अब्दुल्ला Aydın

यह सिर्फ मुझे है या यह वही है जो ओपी नहीं चाहता था? (यानी मैन्युअल रूप से हर कॉलम को क्वेरी में जोड़ते हैं।)
Byson

आप सही कह रहे हैं, मैंने अभी ओपी की "I JUST एक पंक्ति को उसी तालिका में सम्मिलित करने के लिए कॉपी करना चाहता है" वाक्य को पढ़ा, हो सकता है, वैसे भी, यह अभी भी कुंजी के लिए "डुप्लिकेट प्रविष्टि 'xxx' के लिए उपयोगी है ???" त्रुटि ^^
अब्दुल्ला Aydın

0

यहाँ एक उत्तर है जो मुझे इस साइट पर ऑनलाइन मिला है, यह बताता है कि उपरोक्त 1 कैसे करना है आप पृष्ठ के निचले भाग में उत्तर पा सकते हैं। मूल रूप से, आप जो करते हैं वह स्मृति में रखी गई एक अस्थायी तालिका में कॉपी की जाने वाली पंक्ति की नकल है। फिर आप अद्यतन का उपयोग करके प्राथमिक कुंजी संख्या को बदलते हैं। फिर आप इसे लक्ष्य तालिका में पुनः सम्मिलित करते हैं। आप तब टेबल को ड्रॉप करें।

यह इसके लिए कोड है:

रचनात्मक सहायक rescueteamइंजन = स्मृति चयन * सेfitnessreport4सृजित जहां 1 = # 1 पंक्ति प्रभावित हो। UPDATE rescueteamSET rID = Null WHID rID = 1; # 1 पंक्ति प्रभावित। INSERT INTO SEL fitnessreport4* * FROM rescueteam; # 1 पंक्ति प्रभावित। ड्रॉप टेबल rescueteam# MySQL ने खाली रिजल्ट सेट (यानी जीरो
रो) लौटा दिया ।

मैंने अस्थायी तालिका बचाव दल बनाया। मैंने अपनी मूल तालिका फिटनेसरेपोर्ट 4 से पंक्ति की नकल की। मैंने तब अस्थायी तालिका में पंक्ति के लिए प्राथमिक कुंजी को शून्य करने के लिए सेट किया है ताकि मैं इसे डुप्लिकेट कुंजी त्रुटि प्राप्त किए बिना मूल तालिका में वापस कॉपी कर सकूं। मैंने कल शाम इस कोड की कोशिश की और यह काम कर गया।


0

यह "ग्रिम ..." के उत्तर का एक अतिरिक्त समाधान है। इस पर कुछ टिप्पणी की गई है जिसमें एक प्राथमिक कुंजी शून्य है। इसके बारे में कुछ टिप्पणियां काम नहीं कर रही हैं। और समाधान पर कुछ टिप्पणियां। हमारे लिए कोई भी समाधान काम नहीं आया। हमारे पास InnoDB तालिका के साथ MariaDB है।

हम अशक्त करने के लिए प्राथमिक कुंजी सेट नहीं कर सके। NULL के बजाय 0 का उपयोग करने से प्राथमिक कुंजी के लिए डुप्लिकेट मान त्रुटि हुई। SET SQL_SAFE_UPDATES = 0;काम भी नहीं किया।

"ग्रिम ..." से समाधान ने काम किया अगर हमने इसके बजाय अपनी प्राथमिक कुंजी को UNIQUE में बदल दिया


-1

बस PHP कोड के अपने टुकड़े को पोस्ट करना चाहता था, क्योंकि मुझे लगता है कि जिस तरह से मैं कॉलम इकट्ठा करता हूं वह पिछले उदाहरणों की तुलना में कोड में थोड़ा क्लीनर है। इसके अलावा यह दिखाता है कि आप किसी फ़ील्ड को आसानी से कैसे बदल सकते हैं, इस स्थिति में एक स्ट्रिंग जोड़ सकते हैं। लेकिन आप नए जोड़े गए रिकॉर्ड के साथ एक विदेशी कुंजी फ़ील्ड भी बदल सकते हैं, यदि आप कुछ चाइल्ड रिकॉर्ड भी कॉपी करना चाहते हैं।

  // Read columns, unset the PK (always the first field in my case)
  $stmt = $conn->prepare('SHOW COLUMNS FROM template');
  $stmt->execute();

  $columns = $stmt->fetchAll();
  $columns = array_map(function ($element) { return $element['Field']; }, $columns);

  unset($columns[0]);

  // Insert record in the database. Add string COPY to the name field.
  $sql = "INSERT INTO `template` (".implode(",", $columns).")";
  if ($key = array_search('name', $columns))
      $columns[$key] = "CONCAT(name, ' COPY')";
  $sql .= " SELECT ".implode(",", $columns)." FROM `template` WHERE `id` = ".$id;

  $stmt = $conn->prepare($sql);
  $stmt->execute();

-2

एक बहुत ही सरल समाधान के लिए, आप एक CSV फ़ाइल के रूप में पंक्ति को निर्यात करने के लिए PHPMyAdmin का उपयोग कर सकते हैं और फिर संशोधित CSV फ़ाइल आयात कर सकते हैं। आयात करने से पहले कोई मूल्य दिखाने के लिए आईडी / प्राथमिक कॉलम का संपादन।

SELECT * FROM table where primarykey=1

फिर पृष्ठ के नीचे:

यहां छवि विवरण दर्ज करें

जहां कहा जाता है "निर्यात" बस निर्यात करें, फिर प्राथमिक मूल्य को हटाने के लिए सीएसवी फ़ाइल को संपादित करें, इसलिए यह खाली है, और फिर इसे डेटाबेस में आयात करें, एक नया प्राथमिक आयात पर सौंपा जाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.