উত্তর:
ব্যবহার INSERT ... SELECT
:
insert into your_table (c1, c2, ...)
select c1, c2, ...
from your_table
where id = 1
c1, c2, ...
সমস্ত কলাম বাদে কোথায় id
। আপনি যদি id
2 এর সাথে স্পষ্টভাবে সন্নিবেশ করতে চান তবে তা আপনার INSERT কলাম তালিকায় অন্তর্ভুক্ত করুন এবং আপনার নির্বাচন করুন:
insert into your_table (id, c1, c2, ...)
select 2, c1, c2, ...
from your_table
where id = 1
id
অবশ্যই দ্বিতীয় ক্ষেত্রে অবশ্যই 2 এর সম্ভাব্য নকলের যত্ন নিতে হবে।
আইএমও, কেবলমাত্র সেই সারিটি অনুলিপি করার জন্য সিক্যেল স্টেটমেন্টগুলি ব্যবহার করা ভাল বলে মনে হচ্ছে, একই সময়ে আপনাকে অবশ্যই কলামগুলি উল্লেখ করতে হবে এবং পরিবর্তন করতে হবে।
CREATE TEMPORARY TABLE temp_table ENGINE=MEMORY
SELECT * FROM your_table WHERE id=1;
UPDATE temp_table SET id=NULL; /* Update other values at will. */
INSERT INTO your_table SELECT * FROM temp_table;
DROP TABLE temp_table;
Av8n.com এও দেখুন - কীভাবে এসকিউএল রেকর্ডটি ক্লোন করবেন
উপকারিতা:
your_table
পরমাণু অপারেশনে একটি সম্পূর্ণ-সঠিক রেকর্ড isোকানো হয় ।Error Code: 1113. A table must have at least 1 column
।
SET id=NULL
একটি ত্রুটি হতে পারে Column 'id' cannot be null
। দ্বারা পরিবর্তিত করা উচিতUPDATE temp_table SET id = (SELECT MAX(id) + 1 as id FROM your_table);
টেবিল হয় বলে user(id, user_name, user_email)
।
আপনি এই ক্যোয়ারীটি ব্যবহার করতে পারেন:
INSERT INTO user (SELECT NULL,user_name, user_email FROM user WHERE id = 1)
Result: near "SELECT": syntax error
এটি সহায়তা করেছে এবং এটি একটি ব্লগ / পাঠ্য কলামগুলি সমর্থন করে।
CREATE TEMPORARY TABLE temp_table
AS
SELECT * FROM source_table WHERE id=2;
UPDATE temp_table SET id=NULL WHERE id=2;
INSERT INTO source_table SELECT * FROM temp_table;
DROP TEMPORARY TABLE temp_table;
USE source_table;
দ্রুত, পরিষ্কার সমাধানের জন্য যার জন্য কলামগুলির নামকরণের প্রয়োজন নেই, আপনি এখানে বর্ণিত হিসাবে প্রস্তুত বিবৃতি ব্যবহার করতে পারেন: https://stackoverflow.com/a/23964285/292677
আপনার যদি জটিল সমাধানের প্রয়োজন হয় যাতে আপনি এটি প্রায়শই করতে পারেন, আপনি এই পদ্ধতিটি ব্যবহার করতে পারেন:
DELIMITER $$
CREATE PROCEDURE `duplicateRows`(_schemaName text, _tableName text, _whereClause text, _omitColumns text)
SQL SECURITY INVOKER
BEGIN
SELECT IF(TRIM(_omitColumns) <> '', CONCAT('id', ',', TRIM(_omitColumns)), 'id') INTO @omitColumns;
SELECT GROUP_CONCAT(COLUMN_NAME) FROM information_schema.columns
WHERE table_schema = _schemaName AND table_name = _tableName AND FIND_IN_SET(COLUMN_NAME,@omitColumns) = 0 ORDER BY ORDINAL_POSITION INTO @columns;
SET @sql = CONCAT('INSERT INTO ', _tableName, '(', @columns, ')',
'SELECT ', @columns,
' FROM ', _schemaName, '.', _tableName, ' ', _whereClause);
PREPARE stmt1 FROM @sql;
EXECUTE stmt1;
END
আপনি এটি দিয়ে চালাতে পারেন:
CALL duplicateRows('database', 'table', 'WHERE condition = optional', 'omit_columns_optional');
উদাহরণ
duplicateRows('acl', 'users', 'WHERE id = 200'); -- will duplicate the row for the user with id 200
duplicateRows('acl', 'users', 'WHERE id = 200', 'created_ts'); -- same as above but will not copy the created_ts column value
duplicateRows('acl', 'users', 'WHERE id = 200', 'created_ts,updated_ts'); -- same as above but also omits the updated_ts column
duplicateRows('acl', 'users'); -- will duplicate all records in the table
অস্বীকৃতি: এই সমাধানটি কেবলমাত্র সেই ব্যক্তির জন্য যারা প্রায়শই অনেক টেবিলের মধ্যে বারে বারে সারিগুলি নকল করে রাখবেন। এটি দুর্বৃত্ত ব্যবহারকারীর হাতে বিপজ্জনক হতে পারে।
আপনি কলামের স্বতঃবৃদ্ধির মান হিসাবে '0' এও যেতে পারেন, রেকর্ডটি তৈরি হওয়ার সময় সঠিক মানটি ব্যবহার করা হবে। এটি অস্থায়ী টেবিলগুলির তুলনায় অনেক সহজ।
উত্স: মাইএসকিউএলে সারিগুলি অনুলিপি করা (দ্বিতীয় মন্তব্য দেখুন, টিআরআইজি দ্বারা, প্রথম সমাধানে, লরে লিখেছেন)
এখানে দুর্দান্ত উত্তর। নীচে আমি সঞ্চিত পদ্ধতির একটি নমুনা দিচ্ছি যা আমি বিকাশ করছি এমন একটি ওয়েব অ্যাপের জন্য এই কাজটি সম্পাদন করার জন্য লিখেছিলাম:
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON
-- Create Temporary Table
SELECT * INTO #tempTable FROM <YourTable> WHERE Id = Id
--To trigger the auto increment
UPDATE #tempTable SET Id = NULL
--Update new data row in #tempTable here!
--Insert duplicate row with modified data back into your table
INSERT INTO <YourTable> SELECT * FROM #tempTable
-- Drop Temporary Table
DROP TABLE #tempTable
insert into MyTable(field1, field2, id_backup)
select field1, field2, uniqueId from MyTable where uniqueId = @Id;
আপনি যদি মাইএসকিউএল ওয়ার্কবেঞ্চ ব্যবহার করতে সক্ষম হন তবে সারিটি ডান-ক্লিক করে এবং 'অনুলিপি সারিটি' নির্বাচন করে, এবং তারপরে খালি সারিটিতে ডানদিকের ক্লিক করে এবং 'পেস্ট সারিটি' নির্বাচন করে, এবং তারপরে আইডি পরিবর্তন করে এবং তারপরে এটি করতে পারেন 'প্রয়োগ' ক্লিক করুন।
সারিটি অনুলিপি করুন:
অনুলিপি করা সারিটি ফাঁকা সারিতে আটকে দিন:
আইডি পরিবর্তন করুন:
প্রয়োগ করুন:
আমি একই বৈশিষ্ট্যটি খুঁজছিলাম কিন্তু আমি মাইএসকিউএল ব্যবহার করি না। আমি অবশ্যই প্রাথমিক কী (আইডি) বাদে সমস্ত ক্ষেত্রগুলি অনুলিপি করতে চেয়েছিলাম। এটি একটি শট ক্যোয়ারী ছিল, কোনও স্ক্রিপ্ট বা কোডে ব্যবহৃত হবে না।
আমি পিএল / এসকিউএল নিয়ে আমার পথ খুঁজে পেয়েছি তবে আমি নিশ্চিত যে অন্য কোনও এসকিউএল আইডিই করবে would আমি একটি বেসিক করেছি
SELECT *
FROM mytable
WHERE id=42;
তারপরে এটি কোনও এসকিউএল ফাইলে রফতানি করুন যেখানে আমি এটি পেতে পারি
INSERT INTO table (col1, col2, col3, ... , col42)
VALUES (1, 2, 3, ..., 42);
আমি কেবল এটি সম্পাদনা করেছি এবং এটি ব্যবহার করেছি:
INSERT INTO table (col1, col2, col3, ... , col42)
VALUES (mysequence.nextval, 2, 3, ..., 42);
আমি মি যা খুব সংক্ষিপ্ত পোস্টের বিভিন্নতা ব্যবহার করি:
INSERT INTO something_log
SELECT NULL, s.*
FROM something AS s
WHERE s.id = 1;
যতক্ষণ না টেবিলগুলির অভিন্ন ক্ষেত্র রয়েছে (লগ টেবিলের স্বয়ংক্রিয় বৃদ্ধি ব্যতীত), তবে এটি দুর্দান্তভাবে কাজ করে।
যেহেতু আমি যখনই সম্ভব সঞ্চিত প্রক্রিয়াগুলি ব্যবহার করি (অন্যান্য প্রোগ্রামারদের যারা ডেটাবেসের সাথে খুব বেশি পরিচিত নন তাদের জীবনকে সহজ করে তোলার জন্য), আপনি যখনই কোনও টেবিলে নতুন ক্ষেত্র যুক্ত করবেন প্রতিবার ফিরে যেতে এবং পদ্ধতিগুলি আপডেট করার সমস্যাটি সমাধান করে ves
এটিও নিশ্চিত করে যে আপনি যদি কোনও টেবিলে নতুন ক্ষেত্র যুক্ত করেন তবে তারা আপনার ডাটাবেস প্রশ্নগুলি আপডেট না করে তাত্ক্ষণিক লগ টেবিলের মধ্যে উপস্থিত হতে শুরু করবে (অবশ্যই যদি আপনার ক্ষেত্র স্পষ্টভাবে সেট করে এমন কিছু না থাকে)
সতর্কতা: আপনি একই সাথে উভয় টেবিলের সাথে কোনও নতুন ক্ষেত্র যুক্ত করার বিষয়টি নিশ্চিত করতে চাইবেন যাতে ক্ষেত্রের ক্রম একই থাকে ... অন্যথায় আপনি বিজোড় বাগ পেতে শুরু করবেন। আপনি যদি কেবলমাত্র একজন যা ডাটাবেস ইন্টারফেস লেখেন এবং আপনি খুব যত্নবান হন তবে এটি দুর্দান্তভাবে কাজ করে। অন্যথায়, আপনার সমস্ত ক্ষেত্রের নামকরণে আটকে থাকুন।
দ্রষ্টব্য: দ্বিতীয় চিন্তার বিষয়ে, আপনি যদি একক প্রকল্পে কাজ না করেন তবে আপনি নিশ্চিত যে অন্যরা এতে কাজ করবেন না সমস্ত ক্ষেত্রের নামগুলি স্পষ্টভাবে তালিকাভুক্ত করতে এবং আপনার স্কিমার পরিবর্তন হিসাবে আপনার লগ স্টেটমেন্টগুলি আপডেট করবেন। এই শর্টকাট সম্ভবত দীর্ঘমেয়াদী মাথাব্যথার কারণ হতে পারে না ... বিশেষত একটি উত্পাদন সিস্টেমের ক্ষেত্রে।
INSERT INTO `dbMyDataBase`.`tblMyTable`` ( `IdAutoincrement`, `Column2`, `Column3`, `Column4` ) নির্বাচন খালি, `Column2`, `Column3`, 'কাস্টমভ্যালু' এএস কলাম 4 FroM `dbMyDataBase`.`tblMyTable`` যেখানে b tblMyTable`.`Column2` = 'ইউনিকভ্যালু অফ দ্য কে' ; / * মাইএসকিউএল 5.6 * /