আপনি কীভাবে কোনও এসকিউএল টেবিলের মধ্যে একটি রেকর্ড অনুলিপি করবেন তবে নতুন সারির অনন্য আইডিটি সরিয়ে ফেলবেন?


123

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

insert into MyTable
    select * from MyTable where uniqueId = @Id;

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

আমি নিশ্চিত যে এটির একটি সহজ সমাধান রয়েছে, আমি এটি টিএসকিউএলটি কী তা জানার জন্য কেবল জানি না।

উত্তর:


186

এটা চেষ্টা কর:


insert into MyTable(field1, field2, id_backup)
    select field1, field2, uniqueId from MyTable where uniqueId = @Id;

নির্দিষ্ট করা হয়নি এমন কোনও ক্ষেত্র তাদের ডিফল্ট মান (যা সাধারণত সংজ্ঞায়িত না হলে নুল হয়) গ্রহণ করা উচিত।


2
অসাধারণ. কবজির মতো কাজ করেছেন। এটি একবার প্রকাশ করার পরে এটি স্পষ্ট ছিল। ধন্যবাদ !!
কিলহফার

1
আপনার যদি কয়েকটি কলাম থাকে তবে এটি কাজ করবে। আপনার যদি 20 বা 30 টি কলাম থাকে তবে আপনি এখনও এই পদ্ধতিটি ব্যবহার করতে পারেন তবে এটি ভয়ঙ্কর। এছাড়াও, প্রতিটি সময় যখন আপনি একটি কলাম যুক্ত করেন এবং সেই ডেটাটি অনুলিপি করতে চান তখন এই স্ক্রিপ্টে কলামটি যুক্ত করা দরকার। সিস টেবিলগুলি ব্যবহার করে সক্রিয়ভাবে সন্নিবেশ করা ভাল।
জিয়ারা

93

ঠিক আছে, আমি জানি এটি একটি পুরানো সমস্যা তবে আমি আমার উত্তর যাইহোক পোস্ট করি।

আমি এই সমাধানটি পছন্দ করি। আমাকে কেবল পরিচয় কলাম (গুলি) নির্দিষ্ট করতে হবে।

SELECT * INTO TempTable FROM MyTable_T WHERE id = 1;
ALTER TABLE TempTable DROP COLUMN id;
INSERT INTO MyTable_T SELECT * FROM TempTable;
DROP TABLE TempTable;

"আইডি" -ক্যালোমটি হ'ল পরিচয় কলাম এবং এটিই আমাকে নির্দিষ্ট করতে হবে column এটি যাইহোক অন্য উপায়ে তুলনায় ভাল। :-)

আমি এসকিউএল সার্ভার ব্যবহার করি। আপনি CREATE TABLE"এবং" UPDATE TABLE"সারি 1 এবং 2 এ ব্যবহার করতে চাইতে পারেন , হুম, আমি দেখেছি যে সে সত্যিই যে উত্তর চেয়েছিল আমি আমি সত্যিই তার উত্তর দিই নি। তিনি আইডিটি অন্য কলামেও অনুলিপি করতে চেয়েছিলেন। তবে এই সমাধানটি একটি নতুন অটো-আইডি দিয়ে একটি অনুলিপি তৈরির জন্য দুর্দান্ত।

আমি আমার সমাধানটি মাইকেল ডিবটসের আইডিয়াস দিয়ে সম্পাদনা করি।

use MyDatabase; 
SELECT * INTO #TempTable FROM [MyTable] WHERE [IndexField] = :id;
ALTER TABLE #TempTable DROP COLUMN [IndexField]; 
INSERT INTO [MyTable] SELECT * FROM #TempTable; 
DROP TABLE #TempTable;

আপনি "," দিয়ে আলাদা করে একাধিক কলাম ড্রপ করতে পারেন। আপনি যে অনুলিপিটি অনুলিপি করতে চান তাতে আইডিটি প্রতিস্থাপন করা উচিত। মাই ডেটাবেস, মাই টেবিল এবং সূচিপত্র আপনার নামের সাথে অবশ্যই প্রতিস্থাপন করা উচিত (অবশ্যই)।


1
এটি মুশকিল, আপনি কীভাবে নিশ্চিত হন যে আপনি লাইন 3-এ INSERT INTO এর সময় সঠিক আইডিটি সঠিক সারিতে অনুলিপি করছেন?
এর্নো

আইডি-কলামটি একটি পরিচয় কলাম (আমার সারণীতে) তাই আমি মানটির যত্ন নিই না। আমি কেবল "পুরানো" র মতো একই মানগুলিকে ধারণ করে একটি নতুন রেকর্ড চাই।
জোনাস

9
কারণ TempTable, এটি ব্যবহার করা ভাল না #TempTable, তাই এটি একটি সত্যিকারের অস্থায়ী টেবিল?
জেস

3
আমি এটি নিম্নলিখিত ফর্ম্যাটটিতে ব্যবহার করছি use MyDatabase; SELECT * INTO #TempTable FROM [TABLE] WHERE [indexfield] = :id; ALTER TABLE #TempTable DROP COLUMN [indexfield]; INSERT INTO [TABLE] SELECT * FROM #TempTable; DROP TABLE #TempTable;এইভাবে আমি জানি এটি একটি ইন্টারমিটেন্ড ফাইল ডিস্কে লিখতে কোনও বিলম্ব ছাড়াই অ্যাস্যাপটি পরিষ্কার হয়ে যাবে।
তুষাল্লাকা

3
আপনি $identityযদি নিজের পরিচয় কলামের নামটি হার্ড কোড করতে না চান তবে আপনিও ব্যবহার করতে পারেন
ফ্যাক্টর মিস্টিক

12

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


10

আপনার আইডি ক্ষেত্রটি ছাড়াও সমস্ত ক্ষেত্র উল্লেখ করুন।

INSERT INTO MyTable (FIELD2, FIELD3, ..., FIELD529, PreviousId)
SELECT FIELD2, NULL, ..., FIELD529, FIELD1
FROM MyTable
WHERE FIELD1 = @Id;

6

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

আমি জোনাসের দ্বারা সমাধানটি নিয়েছি এবং এটি কিছুটা সংশোধন করেছি। এটি আমাকে সারিটির একটি অনুলিপি তৈরি করতে এবং তারপরে প্রাথমিক কীটি মূল উত্স টেবিলটিতে ফিরে যুক্ত করার আগে পরিবর্তন করতে দেয়। এটি এমন টেবিলগুলির সাথে কাজ করার জন্যও কার্যকর যা কলামগুলিতে নুল মানগুলিকে মঞ্জুরি দেয় না এবং আপনি প্রতিটি কলামের নাম INSERT এ নির্দিষ্ট করতে চান না।

এই কোডটি 'এবিসি' থেকে 'এক্সওয়াইজেড' -তে সারি অনুলিপি করে

SELECT * INTO #TempRow FROM SourceTable WHERE KeyColumn = 'ABC';
UPDATE #TempRow SET KeyColumn = 'XYZ';
INSERT INTO SourceTable SELECT * FROM #TempRow;
DELETE #TempRow;

একবার ড্রপ টেবিলটি শেষ করে ফেললে।

DROP TABLE #TempRow;

4

আমি জানি আমার উত্তর পার্টিতে দেরি হয়েছে। তবে আমি যেভাবে সমাধান করেছি তা সমস্ত উত্তরের চেয়ে কিছুটা আলাদা।

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

আমার পন্থাটি হ'ল,

  1. সারণীর জন্য কলামগুলির সম্পূর্ণ তালিকা পেতে সিস.কলামগুলি জিজ্ঞাসা করুন এবং কলামের নাম অন্তর্ভুক্ত করুন যেখানে ক্লজ।
  2. এটিকে কলামের নাম হিসাবে সিএসভিতে রূপান্তর করুন।
  3. বিল্ড সিলেক্ট করুন ... এর ভিত্তিতে স্ক্রিপ্টে sertোকান।


declare @columnsToCopyValues varchar(max), @query varchar(max)
SET @columnsToCopyValues = ''

--Get all the columns execpt Identity columns and Other columns to be excluded. Say IndentityColumn, Column1, Column2 Select @columnsToCopyValues = @columnsToCopyValues + [name] + ', ' from sys.columns c where c.object_id = OBJECT_ID('YourTableName') and name not in ('IndentityColumn','Column1','Column2') Select @columnsToCopyValues = SUBSTRING(@columnsToCopyValues, 0, LEN(@columnsToCopyValues)) print @columnsToCopyValues

Select @query = CONCAT('insert into YourTableName (',@columnsToCopyValues,', Column1, Column2) select ', @columnsToCopyValues, ',''Value1'',''Value2'',', ' from YourTableName where IndentityColumn =''' , @searchVariable,'''')

print @query exec (@query)



1

যদি "কী" আপনার পিকে ক্ষেত্র এবং এটি স্বায়ত্তশাসিত হয়।

insert into MyTable (field1, field2, field3, parentkey)
select field1, field2, null, key from MyTable where uniqueId = @Id

এটি আসল রেকর্ড থেকে ফিল্ড 1 এবং ফিল্ড 2 অনুলিপি করে একটি নতুন রেকর্ড তৈরি করবে


1

আমার টেবিলের 100 টি ক্ষেত্র রয়েছে এবং কেবলমাত্র কাজ করার জন্য আমার একটি প্রশ্নের প্রয়োজন। এখন আমি কয়েকটি মৌলিক শর্তসাপেক্ষ যুক্তি সহ যে কোনও ক্ষেত্র স্যুইচআউট করতে পারি এবং এর সাধারণ অবস্থান সম্পর্কে চিন্তা করতে পারি না।

  1. নীচের টেবিলের নামটি আপনার টেবিলের নামের সাথে প্রতিস্থাপন করুন

    SQLcolums = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE (TABLE_NAME = 'TABLE-NAME')"
    
    Set GetColumns = Conn.Execute(SQLcolums)
    Do WHILE not GetColumns.eof
    
    colName = GetColumns("COLUMN_NAME")
  2. আপনার পরিচয় ক্ষেত্রের নামের সাথে মূল পরিচয় ক্ষেত্রের নামটি প্রতিস্থাপন করুন

    IF colName = "ORIGINAL-IDENTITY-FIELD-NAME" THEN ' ASSUMING THAT YOUR PRIMARY KEY IS THE FIRST FIELD DONT WORRY ABOUT COMMAS AND SPACES
        columnListSOURCE = colName 
        columnListTARGET = "[PreviousId field name]"
    ELSE
        columnListSOURCE = columnListSOURCE & colName
        columnListTARGET = columnListTARGET & colName
    END IF
    
    GetColumns.movenext
    
    loop
    
    GetColumns.close    
  3. টেবিলের নামগুলি আবার প্রতিস্থাপন করুন (লক্ষ্য টেবিলের নাম এবং উত্স সারণীর নাম উভয়); আপনার whereশর্তগুলি সম্পাদনা করুন

    SQL = "INSERT INTO TARGET-TABLE-NAME (" & columnListTARGET & ") SELECT " & columnListSOURCE & " FROM SOURCE-TABLE-NAME WHERE (FIELDNAME = FIELDVALUE)" 
    Conn.Execute(SQL)

0

আপনি এটির মতো করতে পারেন:

INSERT INTO DENI/FRIEN01P 
SELECT 
   RCRDID+112,
   PROFESION,
   NAME,
   SURNAME,
   AGE, 
   RCRDTYP, 
   RCRDLCU, 
   RCRDLCT, 
   RCRDLCD 
FROM 
   FRIEN01P      

112 এর পরিবর্তে আপনার সর্বাধিক আইডি নম্বর DENI / FRIEN01P এ রাখা উচিত put


0

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

Cn.Execute("CREATE TEMPORARY TABLE temprow AS SELECT * FROM product WHERE product_id = '12345'")
Cn.Execute("UPDATE temprow SET product_id = '34567'")
Cn.Execute("INSERT INTO product SELECT * FROM temprow")
Cn.Execute("DELETE temprow")
Cn.Execute("DROP TABLE temprow")

আমি মনে করি না এটি সম্পন্ন করার জন্য আপনাকে 5 টি পৃথক এসকিউএল কমান্ড জারি করতে হবে। এবং এছাড়াও, আপনি 2 য় কমান্ডে কাকে নির্ধারণ করেন, সেই পণ্যের আইডি 34567 হওয়া উচিত?
জিয়ারা

34567 কেবল একটি উদাহরণ। আপনি এটি একটি পরিবর্তনশীল বা যা আপনি চান সেট করতে পারেন। আপনার যদি এএসপি ক্লাসিকের আরও ভাল উপায় থাকে তবে আমাকে জানান। :)
ড্যানিয়েল নর্ড

আপনি এই সমস্ত একক লাইনে চালানোর জন্য একটি সঞ্চিত সংগ্রহ লিখতে পারেন। এছাড়াও, সাধারণত পিকে অটো ইনক্রিমেন্ট মান হিসাবে ব্যবহৃত হত। তাই নিজেকে অর্পণ করা ভাল ধারণা নয়।
জিয়ারা

আপনি কিভাবে বলেন পদ্ধতিতে লিখবেন? আমাকে আলোকিত করুন। পি কে? যদি আপনি নিবন্ধ আইডির অর্থ বোঝায় তবে আমাদের সিস্টেমে আমরা আর্টিকেল আইডি ব্যবহার করি যার ভিত্তিতে আমরা সেগুলিতে কী বিক্রি করি example উদাহরণস্বরূপ আমাদের খেলনা স্টোরের 30 টি দিয়ে আর্টিকেল নম্বর থাকে এবং আমাদের স্পোর্টস স্টোর 60 দিয়ে শুরু হয় Plus প্লাস আমরা স্পেস সংরক্ষণ করি যাতে আমরা যদি এতে একটি নতুন রঙ পান, উদাহরণস্বরূপ, আমরা একই ধরণের অন্যদের পাশে একটি আর্টিকেল আইডি রাখতে পারি। যেমনটি বলা হয়েছিল, এটি আমার সমাধান যা আমাদের সিস্টেমে কাজ করে। আপনি কীভাবে ভেরিয়েবল সেট করেন তা গুরুত্বপূর্ণ নয় এবং বেশিরভাগ প্রোগ্রামাররা বুঝতে পারে যে তাদের এবং তাদের সিস্টেমে কী কাজ করে।
ড্যানিয়েল নর্দ

পিকে প্রাথমিক কী বোঝায় for আপনার ক্ষেত্রে এটি '12345'। ক্লাসিক এএসপিতে সঞ্চিত প্রোকটি কীভাবে ব্যবহার করতে হয় তা যদি আপনি জানেন না তবে স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি / 21561657/… দেখুন । এটি করার জন্য, তাদের সকলকে একটি সঞ্চিত প্রোক-এ স্থানান্তরিত করুন এবং আপনার '12345' প্যারামিটার হিসাবে পাস করুন। আপনি যেভাবে কাজ করবেন তবে প্যারামিটারাইজড স্ক্রিপ্টগুলি আজকাল প্রস্তাবিত।
Jeyara
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.