কীভাবে একটি সারি অনুলিপি করবেন এবং মাইএসকিউএলে একটি স্বতঃসংশোধন ক্ষেত্রের সাথে একই টেবিলটিতে সন্নিবেশ করবেন?


233

মাইএসকিউএল আমি একটি সঙ্গে একটি সারিতে কপি করার চেষ্টা করছি autoincrement column ID=1 এবং সন্নিবেশ সঙ্গে একটি নতুন সারি হিসাবে একই টেবিল ডেটা column ID=2

আমি কীভাবে একটি একক ক্যোয়ারিতে এটি করতে পারি?

উত্তর:


351

ব্যবহার INSERT ... SELECT:

insert into your_table (c1, c2, ...)
select c1, c2, ...
from your_table
where id = 1

c1, c2, ...সমস্ত কলাম বাদে কোথায় id। আপনি যদি id2 এর সাথে স্পষ্টভাবে সন্নিবেশ করতে চান তবে তা আপনার INSERT কলাম তালিকায় অন্তর্ভুক্ত করুন এবং আপনার নির্বাচন করুন:

insert into your_table (id, c1, c2, ...)
select 2, c1, c2, ...
from your_table
where id = 1

idঅবশ্যই দ্বিতীয় ক্ষেত্রে অবশ্যই 2 এর সম্ভাব্য নকলের যত্ন নিতে হবে।


1
আপনি INFORMATION_SCHEMA ব্যবহার করে কলামগুলির নামগুলি ক্রমগতভাবে পেতে পারেন ... আমি অবাক হয়েছি আপনি যদি এটি সাব-কোয়েরি এবং কিছু স্ট্রিং ফাংশন হিসাবে করতে পারেন?
হুম

1
@ ইজমির: আপনার ডায়নামিক এসকিউএল ব্যবহার শেষ হবে এবং এর জন্য সাধারণত একটি সঞ্চিত পদ্ধতি তৈরির প্রয়োজন হবে। এটি আপনার কাছে যতটা সহজ কলামের নামের তালিকা থাকা উচিত, এটি তার চেয়ে বেশি সমস্যার মতো মনে হয়।
মিউ খুব ছোট

6
সম্মত ... একবার আপনি স্টোরেড পদ্ধতিতে গেলে আপনি আর ফিরে যাবেন না - আমার অভিজ্ঞতা থেকে আপনি এখনই সেই ডেটাবেসটির সাথে বিবাহবন্ধনে আবদ্ধ হয়েছিলেন এবং যখনই আপনি পরিবর্তন চান আপনি কেবলমাত্র ব্যয়গুলিতে যুক্ত করেছেন।
ইজমির রামিরেজ

11
@ ইজমিরামিরেজ, আপনি এটিকে এমন মনে করেন যে বিবাহ সহজাতভাবে খারাপ জিনিস। :)
অধ্যাপক ফ্যালকন

1
অন্যান্য সমস্ত অনুলিপি ক্ষেত্রের সাথে কলামে কীভাবে একটি কাস্টম মান যুক্ত করবেন?
মনীশ কুমার

49

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

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 এও দেখুন - কীভাবে এসকিউএল রেকর্ডটি ক্লোন করবেন

উপকারিতা:

  • এসকিউএল স্টেটমেন্ট 2 এ ক্লোনিং প্রক্রিয়া চলাকালীন কেবলমাত্র ক্ষেত্রগুলি উল্লেখ করা উচিত। তারা অন্যান্য ক্ষেত্রগুলি সম্পর্কে - বা যত্ন সম্পর্কে জানে না। অন্যান্য ক্ষেত্রগুলি অপরিবর্তিতভাবে কেবল যাত্রার জন্য এগিয়ে যায়। এটি এসকিউএল স্টেটমেন্টগুলিকে লেখার পক্ষে সহজ, পড়া সহজ, বজায় রাখা সহজ এবং আরও প্রসারিত করে তোলে।
  • কেবলমাত্র সাধারণ মাইএসকিউএল স্টেটমেন্ট ব্যবহার করা হয়। অন্য কোনও সরঞ্জাম বা প্রোগ্রামিং ভাষার প্রয়োজন নেই।
  • একটি your_tableপরমাণু অপারেশনে একটি সম্পূর্ণ-সঠিক রেকর্ড isোকানো হয় ।

3
এটি seams, যে এই দুর্দান্ত কৌশল (আমি এটি পছন্দ করেছিলাম, কিন্তু এটি আমার জন্য কাজ করে না) টেবিলগুলিতে কাজ করে না যেগুলিতে টেক্সট / ভিচারার কলাম রয়েছে। আমি এটি চেষ্টা করেছি এবং পেয়েছি: (1163): ব্যবহৃত টেবিল প্রকারটি BLOB / পাঠ্য কলামগুলিকে সমর্থন করে না। এটি অবশ্যই মাইএসকিউএলে ব্যবহার সীমিত করে দেয়! হতে পারে, ভবিষ্যতে এই সীমাগুলি সরিয়ে নেওয়া হয় বা অন্যান্য ডিবি-সিস্টেমে এটি কার্যকর হয়, তবে আপাতত এটি সত্যিই সীমাবদ্ধ।
জুয়ারজেন

আমি সত্যিই অস্থায়ী টেবিলের চালাক ব্যবহার পছন্দ করি। এক টন কলাম সহ টেবিলগুলির জন্য এত দরকারী!
লাসমা

1
দেখতে দুর্দান্ত লাগছে তবে আমি যখন মাইএসকিউএল এ প্রথম ক্যোয়ারী চালাচ্ছি তখন আমি পাই Error Code: 1113. A table must have at least 1 column
ফিজিক্যাল্যাট্রাকশন

3
প্রচুর কলামের জন্য সেরা উত্তর। তবে SET id=NULLএকটি ত্রুটি হতে পারে Column 'id' cannot be null। দ্বারা পরিবর্তিত করা উচিতUPDATE temp_table SET id = (SELECT MAX(id) + 1 as id FROM your_table);
Modder

1
@ ফিজিক্যাল্যাট্রাকশন আপনার প্রথম দুটি লাইন একটি বিবৃতি তা নিশ্চিত করতে হবে।
সামুয়াই

16

টেবিল হয় বলে user(id, user_name, user_email)

আপনি এই ক্যোয়ারীটি ব্যবহার করতে পারেন:

INSERT INTO user (SELECT NULL,user_name, user_email FROM user WHERE id = 1)

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

2
সত্যিই অদ্ভুত এবং আকর্ষণীয়। : ডি
স্পারকিশোর্টস

স্ক্লাইট দিয়ে কাজ করে না। Result: near "SELECT": syntax error
kyb

10

এটি সহায়তা করেছে এবং এটি একটি ব্লগ / পাঠ্য কলামগুলি সমর্থন করে।

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;

এখানে অন্য উত্তরগুলির তুলনায় এটি কীভাবে ভাল?
স্মার

3
আমি মনে করি আপনার যদি 100 টি ক্ষেত্র সহ একটি টেবিল থাকে তবে এটি বেশ ভাল। আইডিটিতে কোনও নালিকা বাধা থাকতে পারে যা এটিকে ব্যর্থ করে তোলে
Loïc Faure-Lacroix

ত্রুটি কোড: 1136. কলামের গণনাটি সারির 1
ওলেক্সি কাইসলটসিন

আপনার যদি 100 টি কলাম সহ একটি টেবিল থাকে তবে এটি আরও ভাল।
টাইলার এস লোপার

পারভাস কি এগুলি নয়, বছরগুলি আগে?
টুলমেকারস্টেভ

7

দ্রুত, পরিষ্কার সমাধানের জন্য যার জন্য কলামগুলির নামকরণের প্রয়োজন নেই, আপনি এখানে বর্ণিত হিসাবে প্রস্তুত বিবৃতি ব্যবহার করতে পারেন: 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

অস্বীকৃতি: এই সমাধানটি কেবলমাত্র সেই ব্যক্তির জন্য যারা প্রায়শই অনেক টেবিলের মধ্যে বারে বারে সারিগুলি নকল করে রাখবেন। এটি দুর্বৃত্ত ব্যবহারকারীর হাতে বিপজ্জনক হতে পারে।


3

আপনি কলামের স্বতঃবৃদ্ধির মান হিসাবে '0' এও যেতে পারেন, রেকর্ডটি তৈরি হওয়ার সময় সঠিক মানটি ব্যবহার করা হবে। এটি অস্থায়ী টেবিলগুলির তুলনায় অনেক সহজ।

উত্স: মাইএসকিউএলে সারিগুলি অনুলিপি করা (দ্বিতীয় মন্তব্য দেখুন, টিআরআইজি দ্বারা, প্রথম সমাধানে, লরে লিখেছেন)


1
এই পদ্ধতিটি নতুন মাইএসকিউএল সংস্করণগুলির সাথে কাজ করে যখন NULL গ্রহণযোগ্য নয়।
মাত্রই ভুল করে

3

এখানে দুর্দান্ত উত্তর। নীচে আমি সঞ্চিত পদ্ধতির একটি নমুনা দিচ্ছি যা আমি বিকাশ করছি এমন একটি ওয়েব অ্যাপের জন্য এই কাজটি সম্পাদন করার জন্য লিখেছিলাম:

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

মারিয়াডিবি / মাইএসকিউএল এর বর্তমান সংস্করণে আইডি = নাল দেয় # 1048 - কলাম 'আইডি' বাতিল হতে পারে না, সেটিং আইডি = 0 কাজ করে;
শেলপাইপিরেরা


2

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

সারিটি অনুলিপি করুন:

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

অনুলিপি করা সারিটি ফাঁকা সারিতে আটকে দিন:

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

আইডি পরিবর্তন করুন:

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

প্রয়োগ করুন:

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


0

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

আমি পিএল / এসকিউএল নিয়ে আমার পথ খুঁজে পেয়েছি তবে আমি নিশ্চিত যে অন্য কোনও এসকিউএল আইডিই করবে 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);

0

আমি মি যা খুব সংক্ষিপ্ত পোস্টের বিভিন্নতা ব্যবহার করি:

INSERT INTO something_log
SELECT NULL, s.*
FROM something AS s
WHERE s.id = 1;

যতক্ষণ না টেবিলগুলির অভিন্ন ক্ষেত্র রয়েছে (লগ টেবিলের স্বয়ংক্রিয় বৃদ্ধি ব্যতীত), তবে এটি দুর্দান্তভাবে কাজ করে।

যেহেতু আমি যখনই সম্ভব সঞ্চিত প্রক্রিয়াগুলি ব্যবহার করি (অন্যান্য প্রোগ্রামারদের যারা ডেটাবেসের সাথে খুব বেশি পরিচিত নন তাদের জীবনকে সহজ করে তোলার জন্য), আপনি যখনই কোনও টেবিলে নতুন ক্ষেত্র যুক্ত করবেন প্রতিবার ফিরে যেতে এবং পদ্ধতিগুলি আপডেট করার সমস্যাটি সমাধান করে ves

এটিও নিশ্চিত করে যে আপনি যদি কোনও টেবিলে নতুন ক্ষেত্র যুক্ত করেন তবে তারা আপনার ডাটাবেস প্রশ্নগুলি আপডেট না করে তাত্ক্ষণিক লগ টেবিলের মধ্যে উপস্থিত হতে শুরু করবে (অবশ্যই যদি আপনার ক্ষেত্র স্পষ্টভাবে সেট করে এমন কিছু না থাকে)

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

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


0
INSERT INTO `dbMyDataBase`.`tblMyTable`` 
(
    `IdAutoincrement`, 
    `Column2`, 
    `Column3`, 
    `Column4` 
) 

নির্বাচন 
    খালি,  
    `Column2`, 
    `Column3`, 
    'কাস্টমভ্যালু' এএস কলাম 4 
FroM `dbMyDataBase`.`tblMyTable`` 
যেখানে b tblMyTable`.`Column2` = 'ইউনিকভ্যালু অফ দ্য কে' 
; 
/ * মাইএসকিউএল 5.6 * /

3
আরও কিছু বিশদ ব্যাখ্যার যোগ করার চেষ্টা করুন, বা এটি অন্যান্য
উত্তরে

-1

আপনি যে সারিটি বেকার করতে চান তা ডাম্প করুন এবং তারপরে উত্পাদিত এসকিউএল ব্যবহার করুন, আইডি কলামটি এটি আবার আমদানি করতে কম less

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