ALTER ব্যবহার করে একটি কলামটি মাইএসকিউএলে উপস্থিত থাকলে তা ফেলে দিন


92

যদি এই কলামটি বিদ্যমান থাকে তবে মাইএসকিউএল টেবিলের কলামটি ড্রপ করতে কীভাবে ALTER ব্যবহার করা যেতে পারে?

আমি জানি আমি ব্যবহার করতে পারি ALTER TABLE my_table DROP COLUMN my_columnতবে এটি my_columnউপস্থিত না থাকলে এটি ত্রুটি ছুঁড়ে দেবে । শর্তযুক্ত কলামটি বাদ দেওয়ার জন্য কি বিকল্প বাক্য গঠন আছে?

আমি মাইএসকিউএল সংস্করণ ব্যবহার করছি 4.0.18।


6
এই প্রশ্নটি মেটাতে উল্লেখ করা হয়েছিল ।
একজন শিক্ষার্থী

উত্তর:


70

মাইএসকিউএল-এর জন্য কোনওটি নেই: মাইএসকিউএল বৈশিষ্ট্য অনুরোধ

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

তবে আপনি যদি জেদ করেন তবে ক্লায়েন্টের মধ্যে প্রথমে অস্তিত্বের জন্য কেবল অনুসন্ধান করা বা ত্রুটিটি ধরা শক্ত নয়।

মারিয়াডিবি 10.0.2 দিয়ে নিম্নলিখিতটি সমর্থন করে:

DROP [COLUMN] [IF EXISTS] col_name 

অর্থাত্

ALTER TABLE my_table DROP IF EXISTS my_column;

তবে মাইএসকিউএলের কয়েকটি ফর্কগুলির মধ্যে কেবল একটির দ্বারা সমর্থিত একটি মানহীন বৈশিষ্ট্যের উপর নির্ভর করা তর্কতিতভাবে খারাপ ধারণা।


8
খাঁটি এসকিউএল এ করার কোনও উপায় আছে কি?
টম

16
কি দারুন. 2005 সালে উল্লেখ করা হয়েছে - 9 বছর আগে। আমি অনুমান করছি এটি অগ্রাধিকার তালিকার নীচে ...
crmpicco

4
মারিয়াডিবি এটি
10.0.2

17
"এটিকে অনুমতি দেওয়া তাত্ক্ষণিকভাবে একটি সত্যই খারাপ ধারণা," - আমি সম্মত নই। কেন ব্যবহারকারীদের কেস ব্যবহার সম্পর্কে সোমোনের অনুমান করা উচিত? আমার কাছে প্রচুর ডাটাবেস রয়েছে এবং সেগুলি সিঙ্কে নেওয়া দরকার। এটি যখন সত্যিই বিরক্ত হয় যখন সফ্টওয়্যারটি মানুষের চেয়ে আরও স্মার্ট হতে চায় ...
অনকেল্টেম

4
১৪ বছর পেরিয়ে গেছে, এখনও নেই। আমি মনে করি না এটি কখনই হয়ে যাবে।
স্টিভ হরভাথ

45

মাইএসকিউএলে এর জন্য কোনও ভাষা স্তর সমর্থন নেই। এখানে 5.0+ এর মধ্যে মাইএসকিউএল তথ্য_স্কেমার মেটা-ডেটা জড়িত এমন একটি কার্যপ্রণালী রয়েছে, তবে এটি আপনার সমস্যাটি 4.0.18 এ সমাধান করবে না।

drop procedure if exists schema_change;

delimiter ';;'
create procedure schema_change() begin

    /* delete columns if they exist */
    if exists (select * from information_schema.columns where table_schema = schema() and table_name = 'table1' and column_name = 'column1') then
        alter table table1 drop column `column1`;
    end if;
    if exists (select * from information_schema.columns where table_schema = schema() and table_name = 'table1' and column_name = 'column2') then
        alter table table1 drop column `column2`;
    end if;

    /* add columns */
    alter table table1 add column `column1` varchar(255) NULL;
    alter table table1 add column `column2` varchar(255) NULL;

end;;

delimiter ';'
call schema_change();

drop procedure if exists schema_change;

আমি একটি ব্লগ পোস্টে আরও কিছু বিস্তারিত তথ্য লিখেছি ।


4
আমি মনে করি যে মন্তব্য হিসাবে ডাঃ হাইডের অবদানের সংক্ষিপ্ত বিবরণটি জরুরী, কারণ এটি যখন নিজের নিজস্ব কোনও উত্তরে থাকে তখন তা স্পষ্ট হয় না। নিশ্চিত হয়ে নিন যে আপনি কোনও পৃথক ডাটাবেস সংশোধন করছেন না: তথ্য_সেমি কলামগুলি থেকে * নির্বাচন করুন * টেবিলের নাম = "দেশ" এবং কলাম_নাম = "আপডেট_্যাট" এবং টেবিল_সেমি = ডেটাবেস () \ জি
হোমার 6

আপনি যদি "স্কিমা_চেঞ্জ বিদ্যমান থাকে তবে ড্রপ পদ্ধতি" থেকে সতর্কতা পেতে চান না; "সেট sql_notes = 0;" যোগ করুন প্রথম লাইনের আগে এবং "সেট স্ক্যুয়াল_নোটস = 1;" যুক্ত করুন শেষ লাইনের পরে বিস্তারিত -> stackoverflow.com/questions/27616564/suppress-mysql-warnings
csonuryilmaz

"ডিলিমিটার" "'ছাড়াই হওয়া উচিত (উদা -> ডিলিমিটার ;;)
ইলিডান

17

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

set @exist_Check := (
    select count(*) from information_schema.columns 
    where TABLE_NAME='YOUR_TABLE' 
    and COLUMN_NAME='YOUR_COLUMN' 
    and TABLE_SCHEMA=database()
) ;
set @sqlstmt := if(@exist_Check>0,'alter table YOUR_TABLE drop column YOUR_COLUMN', 'select ''''') ;
prepare stmt from @sqlstmt ;
execute stmt ;

আশা করি এটি কাউকে সহায়তা করবে, যেমনটি আমার মতো হয়েছিল (অনেকগুলি পরীক্ষার এবং ত্রুটির পরে)।


এটা নিশ্চিত করে। ধন্যবাদ @ প্রদীপ
সুমিত দেশমুখ

14

আমি কেবল একটি পুনরায় ব্যবহারযোগ্য পদ্ধতি তৈরি করেছি যা আদর্শবানকে তৈরি করতে সহায়তা করতে পারে DROP COLUMN:

-- column_exists:

DROP FUNCTION IF EXISTS column_exists;

DELIMITER $$
CREATE FUNCTION column_exists(
  tname VARCHAR(64),
  cname VARCHAR(64)
)
  RETURNS BOOLEAN
  READS SQL DATA
  BEGIN
    RETURN 0 < (SELECT COUNT(*)
                FROM `INFORMATION_SCHEMA`.`COLUMNS`
                WHERE `TABLE_SCHEMA` = SCHEMA()
                      AND `TABLE_NAME` = tname
                      AND `COLUMN_NAME` = cname);
  END $$
DELIMITER ;

-- drop_column_if_exists:

DROP PROCEDURE IF EXISTS drop_column_if_exists;

DELIMITER $$
CREATE PROCEDURE drop_column_if_exists(
  tname VARCHAR(64),
  cname VARCHAR(64)
)
  BEGIN
    IF column_exists(tname, cname)
    THEN
      SET @drop_column_if_exists = CONCAT('ALTER TABLE `', tname, '` DROP COLUMN `', cname, '`');
      PREPARE drop_query FROM @drop_column_if_exists;
      EXECUTE drop_query;
    END IF;
  END $$
DELIMITER ;

ব্যবহার:

CALL drop_column_if_exists('my_table', 'my_column');

উদাহরণ:

SELECT column_exists('my_table', 'my_column');       -- 1
CALL drop_column_if_exists('my_table', 'my_column'); -- success
SELECT column_exists('my_table', 'my_column');       -- 0
CALL drop_column_if_exists('my_table', 'my_column'); -- success
SELECT column_exists('my_table', 'my_column');       -- 0

5

চেজ সেয়বার্টের উত্তরটি কাজ করে, তবে আমি যুক্ত করব যে আপনার কাছে যদি বেশ কয়েকটি স্কিমাটা থাকে তবে আপনি নির্বাচনটি এইভাবে নির্বাচন করতে চান:

select * from information_schema.columns where table_schema in (select schema()) and table_name=...

1

সম্ভবত এটি সমাধান করার সহজ উপায় (এটি কার্যকর হবে):

  • নির্বাচন করুন আইডি, কল 1, কল 2, ... (কেবলমাত্র কলামগুলি আপনি চূড়ান্ত সারণিতে চান) কেবল আমার_তালিকা থেকে নতুন তৈরি করুন;

  • পুরাতন_ টেবিলের পুরাতন_ টেবিল, নতুন_ টেবিল থেকে আমার_সেবাকে পুনরায় নামকরণ করুন;

  • DROP পুরাতন_ টেবিল;

অথবা প্রয়োজনে রোলব্যাকের জন্য পুরাতন_সমাজ রাখুন।

এটি কাজ করবে তবে বিদেশী কীগুলি সরানো হবে না। আপনাকে সেগুলি পরে আমার_তালিকায় পুনরায় যুক্ত করতে হবে; অন্যান্য টেবিলে বিদেশী কীগুলিও উল্লেখ করা হবে যেগুলি my_table উল্লেখ করতে হবে (নতুন my_table- এ নির্দেশিত)।

শুভকামনা ...


1

আপনি এই স্ক্রিপ্টটি ব্যবহার করতে পারেন, আপনার কলাম, স্কিমা এবং সারণির নাম ব্যবহার করতে পারেন

 IF EXISTS (SELECT *
                         FROM INFORMATION_SCHEMA.COLUMNS
                         WHERE TABLE_NAME = 'TableName' AND COLUMN_NAME = 'ColumnName' 
                                             AND TABLE_SCHEMA = SchemaName)
    BEGIN
       ALTER TABLE TableName DROP COLUMN ColumnName;
    END;


-3

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

  1. আপনার সারণীগুলির একটি তালিকা পেতে একটি নতুন স্কয়ার সম্পাদক পান এবং শো টেবিলগুলি চালিত করুন
  2. সমস্ত সারি নির্বাচন করুন এবং প্রসঙ্গ মেনু থেকে ক্লিপবোর্ডে অনুলিপি (অব্যক্ত) চয়ন করুন
  3. অন্য সম্পাদক ট্যাবে নামের তালিকাটি আটকান
  4. আপনার ক্যোয়ারী লিখুন, যেমন টেবিল xড্রপ ALTER a;
  5. কিছু অনুলিপি এবং পেস্ট করুন, যাতে আপনি প্রতিটি টেবিলের জন্য পৃথক ক্যোয়ারী শেষ করেন
  6. কোনও ত্রুটি দেখা দিলে ওয়ার্কবেঞ্চ থামানো উচিত কিনা তা টগল করুন
  7. এক্সিকিউট হিট এবং আউটপুট লগ দেখুন

যে টেবিলগুলির টেবিল ছিল এখন এমন কোনও টেবিল নেই যা লগগুলিতে ত্রুটি দেখিয়েছে

তারপরে আপনি 'ড্রপ a' এটি 'ADOL COLUMN bINT NULL' ইত্যাদিতে পরিবর্তন করতে এবং প্রতিস্থাপন করতে পারেন এবং পুরো জিনিসটি আবার চালাতে পারেন ....

কিছুটা জটিল, তবে শেষ পর্যন্ত আপনি শেষ ফলাফলটি পেয়ে যাবেন এবং পুরো প্রক্রিয়াটি নিয়ন্ত্রণ / পর্যবেক্ষণ করতে পারেন এবং আবার স্কুলে স্ক্রিপ্টগুলির প্রয়োজন হলে সেভ করতে ভুলবেন না।

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