মাইএসকিউএলে, আমি কি একই টেবিলটিতে সন্নিবেশ করতে একটি সারি অনুলিপি করতে পারি?


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

আমি একই টেবিলটিতে সন্নিবেশ করতে কেবল একটি সারি অনুলিপি করতে চাই (যেমন, আমি টেবিলের মধ্যে বিদ্যমান সারিটির সদৃশ করতে চাই) তবে আমি "নির্বাচন করুন" এর পরে সমস্ত কলামগুলি তালিকাভুক্ত না করে এটি করতে চাই, কারণ এই সারণীতে রয়েছে অনেকগুলি কলাম।

তবে আমি যখন এটি করি তখন ত্রুটিটি পাই:

কী 1 এর জন্য সদৃশ এন্ট্রি 'এক্সএক্সএক্সএক্স'

আমি অনুলিপি করতে চাইছি রেকর্ডটির জন্য অস্থায়ী ধারক হিসাবে একই কলামগুলির সাথে অন্য একটি সারণী তৈরি করে এটি পরিচালনা করতে পারি:

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এই জাতীয় কিছু করব যাতে আমি নিশ্চিত হয়ে নিই যে আইডিগুলি বৃদ্ধি এবং অনন্য।
লোক মোগ্রাবি


@ অর্গানিক অ্যাডভোক্ট এর এই প্রশ্নের চেয়ে আরও উত্তর এবং আরও মতামত রয়েছে
ড্রউ

উত্তর:


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;

একটি টেম্প টেবিল হিসাবে, একাধিক রেকর্ড কখনও হওয়া উচিত নয়, তাই আপনাকে প্রাথমিক কী সম্পর্কে চিন্তা করতে হবে না। এটিকে নালিতে সেট করা মাইএসকিউএলকে মানটি নিজেই চয়ন করতে দেয়, তাই ডুপ্লিকেট তৈরির ঝুঁকি নেই।

আপনি যদি অতি-নিশ্চিত হতে চান যে আপনি কেবল একটি সারি toোকানোর জন্য পাচ্ছেন, আপনি INSERT INTO লাইনের শেষে LIMIT 1 যুক্ত করতে পারেন।

মনে রাখবেন যে আমি আমার অস্থায়ী সারণীর নামের ক্ষেত্রে প্রাথমিক কী মান (এই ক্ষেত্রে 1) যুক্ত করেছিলাম।


3
এই সমাধানটি সঠিক (ভোট পেয়েছে এমন কিছুগুলির বিপরীতে) এটি মাইএসকিউএলকে প্রাথমিক কী মানটি চয়ন করতে দেয়।
জান হেটিচ

1
যদিও অসম্পূর্ণ অস্থায়ী টেবিলের নামগুলির তুলনায় ঠিক তেমনভাবে কাজ করবে না ( tmptable_1বনাম tmptable)
কাইরান টিলি

9
একটি প্রাথমিক কী কীভাবে নালাগুলি হতে পারে?
ইমরান শাফকাত

5
যদি এটি নাল হয়, সন্নিবেশ করা হলে এটি স্বয়ংক্রিয়ভাবে পরবর্তী এআই নম্বরটি নির্ধারণ করে।
...

3
ইমরান - আপনি ভাল জিজ্ঞাসা করতে পারেন। আমি ভেবেছিলাম সম্ভবত অস্থায়ী টেবিলের আইডি ক্ষেত্রটি স্বয়ংক্রিয়ভাবে কোনও পিকে তৈরি হয়নি (আমি নিশ্চিত যে এসকিউএল সার্ভার এই পরিস্থিতিতে এটি করে না) তবে তা হয়। আমার টেবিল টেম্পেটেবল_1 করা দরকার সমস্ত কিছু নষ্ট করা primarykey; সমাধানটি কাজ করার জন্য প্রথম লাইনের পরে
ডিজেডেভ

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
এটি মূলত একই সমাধান যা প্রকৃত টেম্প টেবিল সহ কিছুটা ক্লিনার তৈরি নকশার সত্ত্বেও ওপি ইতিমধ্যে তাদের নিজস্ব সমস্যার জন্য সরবরাহ করেছিল । আমি মনে করি ওপি তাদের বিদ্যমান সিনট্যাক্সটি পরিষ্কার করার জন্য নয়, তারা ইতিমধ্যে কী ব্যবহার করছে সে সম্পর্কে আরও ভাল পদ্ধতির জন্য বলেছিল । এটির জন্য সমস্ত উপগ্রহটি সত্যই বুঝতে পারবেন না।
সেপ্টেস্ট

ধন্যবাদ. এটি ডায়নামিক ফাংশনের সাথে ভাল চলছে
সোনাল খুন

এই প্রক্রিয়াটি শেষ হয়ে গেলে কি টেম্পেটেবলকে মুছে ফেলা দরকার?
এসএসএইচ

"ডিফল্টরূপে সমস্ত অস্থায়ী টেবিলগুলি মাইএসকিউএল দ্বারা মুছে ফেলা হয় যখন আপনার ডাটাবেস সংযোগটি শেষ হয়ে যায় Still তবুও আপনি সেগুলি এর মাঝে মুছতে চান তখন আপনি ড্রপ টেবিল কমান্ড জারি করে এটি করেন do" আরও এখানে
লিওনার্ডচালিস

আপনি তৈরি করেছেন 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 হ'ল এটি হ'ল ওপিকে এড়াতে চায়। প্রশ্নটি পড়ুন বা কমপক্ষে একটি উত্তর দেওয়ার মতো "এটিই সম্ভাব্য একমাত্র উপায়"।
ডিভাইস 1

5
কারণ কখনও কখনও প্রশ্ন নিজেই ভুল হয়। :) বিষয়বস্তু পরিবর্তন না করে সারিগুলিকে সদৃশ করার ফলে অপ্রয়োজনীয়তা বাড়ে। অপ্রয়োজনীয়তা কমাতে ডাটাবেস কাঠামো পরিবর্তন করার পরামর্শ দেওয়া উচিত, যদি এটি সম্ভব হয়।
Torben

5
এটি সাধারণ অনুশীলনের অধীনে ঠিক না হওয়ার কারণে এটি ভুল করে না। প্রচুর সময় রয়েছে যখন স্ট্যান্ডার্ড সেরা অনুশীলনগুলি প্রয়োগ হয় না। উদাহরণ: ডাটাবেস নথির প্রতিনিধিত্ব করে এবং পরিবর্তন করার আগে ব্যবহারকারীর একটি নথির অনুলিপি সংরক্ষণ করতে হবে।
ima747

6
কারণ আপনি এই পৃষ্ঠায়
অবতীর্ণ

13

আপনার প্রায় প্রথম ক্যোয়ারীর সাথে এটি ছিল আপনার কেবল কলামগুলি নির্দিষ্ট করা দরকার, thatোকাতে আপনি আপনার প্রাথমিক কীটি বাদ দিতে পারেন যা টেবিলে থাকা অটো-ইনক্রিমেন্টকে স্বয়ংক্রিয়ভাবে একটি নতুন প্রাথমিক কী তৈরি করতে সক্ষম করবে এন্ট্রি।

উদাহরণস্বরূপ এটি পরিবর্তন করুন:

insert into table select * from table where primarykey=1

এটি:

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

কেবল সেন্সরটির জন্য বা কোয়েরির নির্বাচন অংশের জন্য কলামের তালিকায় প্রাথমিককি কলামটি অন্তর্ভুক্ত করবেন না।


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

এই পদ্ধতিটি ধরে নেয় যে:

  • আপনার কাছে _ ডুপ্লিকেট_টেম্প_ট্যাবল নেই
  • আপনার প্রাথমিক কীটি অন্তর্নিহিত
  • আপনার টেবিল তৈরির অ্যাক্সেস রয়েছে

অবশ্যই এটি নিখুঁত নয়, তবে নির্দিষ্ট (সম্ভবত বেশিরভাগ ক্ষেত্রে) এটি কাজ করবে।

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_tbl3 টি ক্ষেত্র রয়েছে 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


অর্থাৎ সর্বোত্তম উত্তর নেই, যদি প্রশংসনীয় সহজবোধ্য: ঢোকান এমনটা tableName( fieldName1, fieldName2, fieldName3) নির্বাচন করুন fieldName1, fieldName2, fieldName3থেকে tableNameকোথায় 1 (একবারে তাদের সব কপি করতে)
jakubplus

দ্বিতীয় - এই উত্তরটি সংক্ষিপ্ত এবং আসলে একটি সারিতে "অনুলিপি" করার চেতনায়।
ব্যবহারকারী 37309

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`;

@ টরবেন দয়া করে প্রশ্নের বামদিকে টিকটি দেখুন (এটি স্বীকৃত হিসাবে চিহ্নিত করুন) যাতে সবাই জানতে পারে যে এটি আপনার পক্ষে কাজ করেছে।
হোসিএনজেএফ

3

নিম্নলিখিত কিছু এই সাইটটি বন্ধ ছিল। কোনও ক্ষেত্রের সংখ্যার সাথে একটি টেবিলে রেকর্ডটি নকল করতে আমি এটিই করেছি:

এটিও ধরে নেয় যে টেবিলের শুরুতে আপনার কাছে একটি এআই ক্ষেত্র রয়েছে

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;

আমার মাইএসকিউএল 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;

বিকল্পভাবে মারিয়্যাডবি / মাইএসকিএল-র নতুন সংস্করণগুলিতে প্রাথমিক কে 0 তে সেট করা যেতে পারে যা autoোকানো হলে স্বয়ংক্রিয়-বৃদ্ধিকে কাজ করতে দেয় allows
শে

2

আমি এটি হতে দেরী হতে পারে, কিন্তু আমার একটি অনুরূপ সমাধান রয়েছে যা আমার পক্ষে কাজ করেছে।

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

এইভাবে আমার কোনও অস্থায়ী টেবিল তৈরি করার দরকার নেই ইত্যাদি the একই সারণীতে সারিটি অনুলিপি করা হওয়ায় Max(PK)+1ফাংশনটি সহজেই ব্যবহার করা যায়।

আমি এই প্রশ্নের সমাধান অনুসন্ধান করতে এসেছি (সিনট্যাক্সটি ভুলে গিয়েছিলাম) এবং আমি নিজের অনুসন্ধানটি শেষ করেছি। মজার বিষয় কীভাবে কিছু সময় কাজ করে।

শুভেচ্ছা সহ


2

প্রাথমিক কীটি যদি স্বয়ংবৃদ্ধি হয় তবে প্রাথমিক কী বাদে কেবলমাত্র প্রতিটি ক্ষেত্র নির্দিষ্ট করুন।

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


2

আমি @ লিওনার্ডচ্যালিসের সমাধানটি আপডেট করেছি কারণ এটি অন্য কারও মতোই আমার পক্ষে কাজ করে না। আমি WHEREক্লজগুলি এবং SET primaryKey = 0টেম্প টেবিলটিতে সরিয়েছি যাতে মাইএসকিউএল স্বয়ংক্রিয়ভাবে প্রাইমারী কে বৃদ্ধি করে

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

এটি অবশ্যই টেবিলের সমস্ত সারিটির সদৃশ করা ।



2

বারকোড কলামে 'সি' উপসর্গের সাথে সদৃশ আইটেমগুলি সন্নিবেশ করানোর জন্য আমি আমার কোহা ডাটাবেসে ব্যবহার করেছি :

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

1

আমাকে কেবল এটি করতে হয়েছিল এবং এটি ছিল আমার ম্যানুয়াল সমাধান:

  1. ইন phpMyAdmin , সারি আপনি অনুলিপি করতে ইচ্ছুক পরীক্ষা
  2. প্রশ্নের ফলাফল ক্রিয়াকলাপগুলির নীচে নীচে 'রফতানি' ক্লিক করুন
  3. পরবর্তী পৃষ্ঠায় 'ফাইল হিসাবে সংরক্ষণ করুন' চেক করুন তারপরে 'যান' ক্লিক করুন
  4. পাঠ্য সম্পাদকের সাহায্যে রফতানি করা ফাইলটি খুলুন, প্রাথমিক ক্ষেত্রের মানটি সন্ধান করুন এবং এটিকে অনন্য কিছুতে পরিবর্তন করুন।
  5. পিছনে phpMyAdmin ক্লিক করুন 'আমদানি' ট্যাব, অধীনে .sql ফাইল ইম্পোর্ট ফাইল সনাক্ত ব্রাউজ ক্লিক 'যাও' এবং ডুপ্লিকেট সারি ঢুকিয়েছে দিতে হবে।

কি আপনি জানা না থাকলে প্রাথমিক ক্ষেত্র, আপনার এ বর্ণন ফিরে phpMyAdmin পৃষ্ঠা এ ক্লিক করুন 'গঠন' ট্যাব এবং অধীনে পৃষ্ঠার নীচের অংশে অবস্থিত 'ইনডেক্সে' এটা আপনাকে দেখাবে যা 'FIELD' টি 'কীনাম' মান 'প্রাথমিক'

অনেক দূরের মতো, তবে আপনি যদি মার্কআপ নিয়ে ডিল করতে না চান এবং কেবল একটি সারির নকল করতে চান তবে সেখানে যান।


সুন্দর, বাক্সের বাইরে কোনও উপায় না করে অপটিকে উত্তর দিন। স্পষ্টতই যেমন ব্লবস এবং জিওস্প্যাটিয়াল ডেটা সব ক্ষেত্রেই কাজ করে না তবে খুব সহজেই টানতে পারা যায় এবং এই বিজোড় বলের পরিবর্তনের জন্য কাজ করে।
স্ট্রাইক্সি

1

এই সমাধানটি উপরে দেখানো হয়েছে নির্বাচিত সারিগুলির জন্যও নিখুঁত কাজ করে। উদাহরণস্বরূপ আমি আমার সুন্দর 2 কর্ম প্রকল্পের জন্য বিক্ষোভ সারি তৈরি করছি এবং এটি নিখুঁত কাজ করে।

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

নেক্রোপোস্টের জন্য দুঃখিত তবে এটিই আমি গুগলের সাথে আপ করেছি এবং যেহেতু এই সহায়কটি কিন্তু সমস্যাযুক্ত বলে আমি পেয়েছি অন্য যে কেউ এটিকে খনন করেছে তাদের জন্য আমি একটি গুরুত্বপূর্ণ পরিবর্তন অবদান রাখতে চেয়েছিলাম।

প্রথমত, আমি এসকিউএল সার্ভার ব্যবহার করছি, মাইএসকিউএল নয়, তবে আমার মনে হয় এটি একইভাবে কাজ করা উচিত। আমি লিওনার্ড চ্যালিসের সমাধানটি ব্যবহার করলাম কারণ এটি সহজতম এবং প্রয়োজনীয়তার সাথে মিলিত হয়েছিল, তবে এটির সাথে সমস্যা আছে - আপনি যদি কেবল পিকে নেন এবং এটি 1 দ্বারা বৃদ্ধি করেন তবে প্রশ্নটিতে সারি যুক্ত হওয়ার পরে আপনি যদি অন্যান্য রেকর্ড যুক্ত করেছেন তবে কী হবে? । আমি স্থির করেছিলাম যে কেবলমাত্র পিকে স্বতঃসংশোধন সিস্টেমটিকে পরিচালনা করা ভাল best তাই আমি নিম্নলিখিতটি করলাম:

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

আমি বিশ্বাস করি এটি মাইএসকিউএলে একইভাবে কাজ করবে, তবে আমি এটি পরীক্ষা করতে পারছি না, দুঃখিত


1
সম্পূর্ণ বাকওয়াস উত্তর
আসাদইয়ারখান

0

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে এখানে আরও একটি সমাধান রয়েছে:

এটি মূল সারণিতে একটি সারিটির নকল করে, প্রাথমিক কীটি স্বয়ংক্রিয়ভাবে বৃদ্ধি হয় এবং নতুন প্রধান টেবিল আইডির সাথে লিঙ্কযুক্ত-সারণী ডেটার অনুলিপি তৈরি করে।

কলামের নাম পাওয়ার জন্য অন্যান্য বিকল্প:
- থেকে কলম দেখান tablename; (কলামের নাম: মাঠ)
-ডিসক্রিবি tablename (কলামের নাম: মাঠ)
-২০ কলাম_নাম FROM তথ্য_চেমি.কলামগুলি WHERE টেবিলের নাম = 'টেবিলের নাম' (কলামের নাম: কলামের নাম)

//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 করবেন না। কেবল অস্থায়ী টেবিলের অটো-ইনক্রিমেন্ট ফিল্ডটি NUL এ সেট করুন। এটি একটি ত্রুটি উপস্থাপন করবে, কিন্তু অস্থায়ী সারণীতে সমস্ত ক্ষেত্রের নীচের 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`;

দ্রষ্টব্য: আপনি যদি ত্রুটি পেয়ে থাকেন (# 1048) NUL এর পরিবর্তে '' ব্যবহার করুন
আবদুল্লাহ আয়দান

এটা শুধু আমার নাকি এই হল ঠিক কি ওপি করা হয়নি চাও? (অর্থাৎ ম্যানুয়ালি প্রতিটি কলামে ক্যোয়ারিতে যুক্ত করা হয়েছে))
বাইসন

আপনি ঠিক বলেছেন, আমি কেবল ওপি'র "একই টেবিলের মধ্যে সন্নিবেশ করতে একটি সারিটি অনুলিপি করতে চাই" বাক্যটি পড়েছি, সম্ভবত, যাইহোক এটি কীটির জন্য "ডুপ্লিকেট এন্ট্রি 'এক্সএক্সএক্সএক্স' এর জন্য এখনও দরকারী ???" ত্রুটি ^^
আবদুল্লাহ আইডন

0

এই সাইটে অনলাইনে পাওয়া একটি উত্তর এখানে দেওয়া হল উপরোক্ত 1 কীভাবে করবেন তা বর্ণনা করে আপনি উত্তরটির পৃষ্ঠার নীচে খুঁজে পেতে পারেন। মূলত, আপনি যা করেন তা হ'ল সারিটি অনুলিপি করার জন্য মেমরিতে রাখা একটি অস্থায়ী টেবিলের কাছে। তারপরে আপনি আপডেট ব্যবহার করে প্রাথমিক কী নম্বরটি পরিবর্তন করুন। তারপরে আপনি এটিকে লক্ষ্য সারণিতে পুনরায় .োকান। তারপরে আপনি টেবিলটি ফেলে দিন।

এটি এর জন্য কোড:

টেম্পোরারি টেবিল rescueteamইঞ্জিন তৈরি করুন fitnessreport4= স্মৃতি নির্বাচন করুন * যেত রাইড = 1 থেকে # 1 টি সারি প্রভাবিত। আপডেট rescueteamসেট রাইড = নাল যেখানে রাইড = 1; # 1 সারি প্রভাবিত। fitnessreport4নির্বাচন করুন * থেকে নির্বাচন করুন rescueteam; # 1 সারি প্রভাবিত। ড্রপ টেবিল rescueteam# মাইএসকিউএল একটি খালি ফলাফল সেট (অর্থাত শূন্য
সারি) ফেরত দিয়েছে ।

আমি অস্থায়ী টেবিল রেসকিটাম তৈরি করেছি। আমি আমার মূল টেবিল ফিটনেসপোর্ট 4 থেকে সারিটি অনুলিপি করেছি। আমি তারপরে অস্থায়ী টেবিলের সারিটির প্রাথমিক কীটি বাতিল করতে স্থির করেছিলাম যাতে ডুপ্লিকেট কী ত্রুটি না পেয়ে এটিকে আবার মূল টেবিলটিতে অনুলিপি করতে পারি। আমি গতকাল সন্ধ্যায় এই কোডটি চেষ্টা করেছি এবং এটি কার্যকর হয়েছে।


0

এটি "গ্রিম ..." এর উত্তরের একটি অতিরিক্ত সমাধান এটি নাল হিসাবে একটি প্রাথমিক কী থাকার বিষয়ে কিছু মন্তব্য রয়েছে। এটি সম্পর্কে কিছু মন্তব্য কাজ করছে না। এবং সমাধান সম্পর্কে কিছু মন্তব্য। সমাধানগুলির কোনওটিই আমাদের পক্ষে কাজ করে নি। InnoDB টেবিল সহ আমাদের মারিয়াডিবি রয়েছে।

নালটিকে অনুমতি দেওয়ার জন্য আমরা প্রাথমিক কীটি সেট করতে পারি নি। NULL এর পরিবর্তে 0 ব্যবহার করা প্রাথমিক কীটির জন্য সদৃশ মান ত্রুটির দিকে নিয়ে যায়। SET SQL_SAFE_UPDATES = 0;কাজও করেনি।

"গ্রিম ..." থেকে সমাধানটি কার্যকর হয়েছিল যদি আমরা আমাদের প্রাথমিক কী পরিবর্তে অনন্য হয়ে থাকি


-1

আমার পিএইচপি কোডটি কেবল পোস্ট করতে চেয়েছিল, কারণ আমি মনে করি যে আমি কলামগুলি সংগ্রহ করি সেভাবে আগের উদাহরণগুলির তুলনায় কোডটি কিছুটা পরিষ্কার। এছাড়াও এটি আপনাকে দেখায় যে কীভাবে আপনি সহজেই কোনও ক্ষেত্র পরিবর্তন করতে পারেন, এই ক্ষেত্রে একটি স্ট্রিং যুক্ত করুন। তবে আপনি কিছু নতুন রেকর্ডও অনুলিপি করতে চান সেক্ষেত্রে আপনি নতুন যুক্ত হওয়া রেকর্ডের সাথে একটি বিদেশী কী ক্ষেত্রও প্রতিস্থাপন করতে পারেন।

  // 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 ফাইল হিসাবে রফতানি করার পরে কেবল সংশোধিত সিএসভি ফাইলটি আমদানি করতে। আপনি আমদানি করার আগে কোনও মান না দেখানোর জন্য ID / প্রাথমিককী কলামটি সম্পাদনা করা হচ্ছে।

SELECT * FROM table where primarykey=1

তারপরে পৃষ্ঠার নীচে:

এখানে চিত্র বর্ণনা লিখুন

যেখানে বলা হয় "রফতানি" কেবল রফতানি করুন, তারপরে প্রাইমারিকি মানটি মুছে ফেলার জন্য সিএসভি ফাইলটি সম্পাদনা করুন, তাই এটি খালি রয়েছে, এবং তারপরে এটি কেবল ডাটাবেসে আমদানি করুন, আমদানিতে একটি নতুন প্রাথমিককে বরাদ্দ করা হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.