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


195

আমার কাছে প্রচুর পরিমাণে সারি রয়েছে যা আমি অনুলিপি করতে চাই, তবে আমার একটি ক্ষেত্র পরিবর্তন করতে হবে।

আমি যে সারিগুলি অনুলিপি করতে চাই তা নির্বাচন করতে পারি:

select * from Table where Event_ID = "120"

এখন আমি সেই সমস্ত সারিগুলি অনুলিপি করতে চাইছি এবং এটিকে সেট করার সময় নতুন সারি তৈরি Event_IDকরতে চাই 155। আমি কীভাবে এটি সম্পাদন করতে পারি?

উত্তর:


279
INSERT INTO Table
          ( Event_ID
          , col2
           ...
          )
     SELECT "155"
          , col2
           ...
      FROM Table WHERE Event_ID = "120"

এখানে, কল 2, ... আপনার সারণীতে অবশিষ্ট কলামগুলি ( ইভেন্ট_আইডি ব্যতীত ) উপস্থাপন করবে ।


39
কলামের নাম উল্লেখ না করে এটি করার কোনও উপায় আছে?
অ্যান্ড্রু

4
আমার এরকম কিছু জানা নেই. অবশ্যই, যদি আপনার টেবিলের মতো 1000 কলাম বা অন্য কিছু থাকে এবং আপনি সেগুলি সমস্ত টাইপ করতে চান না, তবে আপনি আপনার এসকিউএল বিবৃতি তৈরি করতে একটি এসকিউএল বিবৃতি লিখতে পারেন :)। আপনি যেভাবে যাবেন তা হ'ল তথ্য_সেমিমাটি টেবিলের কলামের নামগুলি পেতে ব্যবহার করা। তবে এটি সত্যই অতিরিক্ত দক্ষতা, আমি কেবল কলামের নামগুলি টাইপ করব out
ডিসিপি

3
বাকী কলামগুলি পাওয়ার জন্য এটি কি তারকাচিহ্ন ব্যবহার করে সম্ভব হবে?
পিটার

2
আমি ইতিমধ্যে এটি upvated আছে তা খুঁজে পেতে upvote এ লগ ইন। আমার ধারণা এখন এটি আমাকে বেশ কয়েকবার বাঁচিয়েছে :) ধন্যবাদ!
এক্সেল

2
@ বিটারব্লু - দুঃখিত, আমি আপনার মন্তব্য বুঝতে পারি না। আমি কখনই কল 2 বলিনি, ... এমন কলামগুলি ছিল যা আপনি অনুলিপি করতে চান না, আমি কেবল বলেছি তারা টেবিল থেকে অবশিষ্ট কলামগুলি উপস্থাপন করে। এটি সুস্পষ্ট যে এগুলি অনুলিপি করা হবে, অন্যথায়, তারা এসকিউএল বিবৃতিতে মোটেই থাকত না।
ডিসিপি

140

এটি এমন একটি সমাধান যেখানে আপনার টেবিলের অনেকগুলি ক্ষেত্র রয়েছে এবং সমস্ত ক্ষেত্র টাইপ করা থেকে কোনও আঙুলের ক্র্যাম্প পেতে চান না, কেবল প্রয়োজনীয়গুলি টাইপ করুন :)

কিছু ক্ষেত্রের আলাদা মান সহ একই টেবিলে কীভাবে কয়েকটি সারি অনুলিপি করতে হবে:

  1. আপনি অনুলিপি করতে চান এমন সমস্ত সারি দিয়ে একটি অস্থায়ী টেবিল তৈরি করুন
  2. আপনি যে মানগুলি চান সেগুলি সহ অস্থায়ী সারণীতে সমস্ত সারি আপডেট করুন
  3. আপনার যদি একটি অটো ইনক্রিমেন্ট ক্ষেত্র থাকে, আপনার অস্থায়ী সারণীতে এটি NUL এ সেট করা উচিত
  4. অস্থায়ী টেবিলের সমস্ত সারিটি আপনার মূল সারণীতে অনুলিপি করুন
  5. অস্থায়ী টেবিলটি মুছুন

তোমার গোপন সংকেত:

CREATE table temporary_table AS SELECT * FROM original_table WHERE Event_ID="155";

UPDATE temporary_table SET Event_ID="120";

UPDATE temporary_table SET ID=NULL

INSERT INTO original_table SELECT * FROM temporary_table;

DROP TABLE temporary_table

সাধারণ দৃশ্যের কোড:

CREATE table temporary_table AS SELECT * FROM original_table WHERE <conditions>;

UPDATE temporary_table SET <fieldx>=<valuex>, <fieldy>=<valuey>, ...;

UPDATE temporary_table SET <auto_inc_field>=NULL;

INSERT INTO original_table SELECT * FROM temporary_table;

DROP TABLE temporary_table

সরলীকৃত / কনডেন্সড কোড:

CREATE TEMPORARY TABLE temporary_table AS SELECT * FROM original_table WHERE <conditions>;

UPDATE temporary_table SET <auto_inc_field>=NULL, <fieldx>=<valuex>, <fieldy>=<valuey>, ...;

INSERT INTO original_table SELECT * FROM temporary_table;

অস্থায়ী সারণী তৈরির ফলে TEMPORARYকীওয়ার্ডটি ব্যবহার করা হয় যখন সেশনটি শেষ হওয়ার সাথে সাথে এটি স্বয়ংক্রিয়ভাবে বাদ পড়বে (@ ar34z প্রস্তাবিত হিসাবে)।


7
TEMPORARYঅস্থায়ী সারণী তৈরি করতে মাইএসকিউএল কীওয়ার্ডটি সমর্থন করে । এর ব্যবহার CREATE TEMPORARY TABLEস্বয়ংক্রিয়ভাবেই আপনার টেবিল ড্রপ যখন অধিবেশন (এসকিউএল কোয়েরি একটি Serie) সমাপ্ত হয়। টেবিলটি ফেলে দেওয়া প্রয়োজনীয় হবে না এবং এটি একই নাম ব্যবহার করে অন্যান্য অস্থায়ী টেবিলগুলির সাথে বিরোধ নয়। (যেমন লাইভ হ্যাকিংয়ের সময় (যা আমি সুপারিশ করব না))
34z

1
এই কোডটি কেবল তখনই কার্যকর হয় যদি আপনি অস্থায়ী_ টেবিলের পরিবর্তে # টেম্পোরারি_ টেবিল ব্যবহার করেন, কোনও এমএসএসকিউএল সমস্যা?
Of42

16
এটি মূলত আমার জন্য নিখুঁতভাবে কাজ করেছে, তবে আমাকে টেম্প টেবিলের প্রাথমিক কীতে নট নল বাধা অতিক্রম করতে হয়েছিল যা মূল টেবিল থেকে অনুলিপিযুক্ত বলে মনে হচ্ছে। আপডেটের আগে টেম্প টেবিলটি পরিবর্তন করে আমি এটি ঠিক করেছি: ALTER TABLE temporary_table MODIFY <auto_inc_not_null_field> INT; তারপরে নূলে প্রাথমিক কীটির আপডেট ব্যর্থ হবে না।
snorris

1
আমি এটা পোস্টগ্রি 9.4 কাজ না পেতে পারেন: Exception: null value in column <auto_inc_not_null_field> violates not-null constraint। আমি চেষ্টা করেছিALTER TABLE temporary_table ALTER COLUMN <auto_inc_not_null_field> DROP NOT NULL;
n1000

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

41

ধরা যাক আপনার টেবিলটিতে আরও দুটি কলাম রয়েছে: ফু এবং বার bar

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, "155"
  FROM Table
 WHERE Event_ID = "120"

4
কলামের নাম উল্লেখ না করে এটি করার কোনও উপায় আছে?
অ্যান্ড্রু

@ পিটারবাইলি মাইএসকিউএলে নতুন, আপনি কীভাবে কোডটি কাজ করে সে সম্পর্কে কিছুটা আলোকপাত করতে পারেন: /
কেএসটিসি

10

যদি আপনার টেবিলটিতে প্রচুর পরিমাণে কলাম রয়েছে এবং প্রতিটি একটি টাইপ করতে না চান তবে আপনি একটি অস্থায়ী টেবিল ব্যবহার করে এটি করতে পারেন, যেমন;

SELECT *
INTO #Temp
FROM Table WHERE Event_ID = "120"
GO

UPDATE #TEMP
SET Column = "Changed"
GO

INSERT INTO Table
SELECT *
FROM #Temp

6
একটি নোট: এটি ধরে নিয়েছে যে আপনার টেবিলে আপনার কোনও প্রাথমিক কী নেই
kommradHomer

2

আরে কীভাবে সমস্ত ক্ষেত্র অনুলিপি করবেন, তাদের মধ্যে একটিকে একই মান + অন্য কিছুতে পরিবর্তন করুন।

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, Event_ID+"155"
  FROM Table
 WHERE Event_ID = "120"

??????????


0

যতক্ষণ ইভেন্ট_আইডি পূর্ণসংখ্যার হয় ততক্ষণ এটি করুন:

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, (Event_ID + 155)
  FROM Table
WHERE Event_ID = "120"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.