আচ্ছা ... হু বছরের পর বছর ধরে কেউ একটি সূক্ষ্ম বিষয় উল্লেখ করেনি।
DROP TABLE IF EXISTS `bla`; CREATE TABLE `bla` ( ... );যুক্তিযুক্ত মনে হলেও , এটি এমন পরিস্থিতির দিকে নিয়ে যায় যখন পুরানো টেবিলটি ইতিমধ্যে চলে গেছে এবং নতুন একটি তৈরি করা হয়নি: কিছু ক্লায়েন্ট এই মুহূর্তে সাবজেক্ট টেবিলটি অ্যাক্সেস করার চেষ্টা করতে পারে।
সর্বোত্তম উপায় হ'ল একেবারে নতুন টেবিল তৈরি করা এবং এটি একটি পুরানো একটি দিয়ে সজ্জিত করা (টেবিলের বিষয়বস্তুগুলি হারিয়ে গেছে):
CREATE TABLE `bla__new` (id int); /* if not ok: terminate, report error */
RENAME TABLE `bla__new` to `bla`; /* if ok: terminate, report success */
RENAME TABLE `bla` to `bla__old`, `bla__new` to `bla`;
DROP TABLE IF EXISTS `bla__old`;
- আপনার ফলাফলটি পরীক্ষা করা উচিত
CREATE ...এবং ত্রুটির ক্ষেত্রে চালিয়ে যাওয়া উচিত নয় , কারণ ব্যর্থতার অর্থ অন্যান্য থ্রেড একই স্ক্রিপ্টটি শেষ করেনি: হয় কারণ এটি মাঝখানে ক্র্যাশ হয়েছে বা এখনও শেষ হয়নি - এটি ভাল ধারণা নিজের দ্বারা জিনিসগুলি পরীক্ষা করুন।
- তারপরে, আপনার প্রথম ফলাফলটি পরীক্ষা করা উচিত
RENAME ...এবং সাফল্যের ক্ষেত্রে অবিরত না হওয়া উচিত : পুরো অপারেশন সফলভাবে শেষ হয়েছে; আরও বেশি, পরের দিকে চালনা RENAME ...করা অনিরাপদ হতে পারে (এবং হবে) যদি অন্য থ্রেড ইতিমধ্যে একই ক্রম শুরু করে (আবরণ না করানোর চেয়ে এই কেসটি কভার করা ভাল, নীচে লকিং নোট দেখুন)।
- দ্বিতীয়ত
RENAME ...পরমাণুভাবে সারণি সংজ্ঞাটি প্রতিস্থাপন করে,
বিশদগুলির জন্য মাইএসকিউএল ম্যানুয়ালটি দেখুন।
- শেষ
DROP ...অবধি, স্পষ্টতই, পুরানো টেবিলটি পরিষ্কার করুন।
সব কিছু বিবৃতি যেমন কিছু দিয়ে SELECT GET_LOCK('__upgrade', -1); ... DO RELEASE_LOCK('__upgrade');মুড়িয়ে ফেলা ত্রুটি যাচাই না করে কেবলমাত্র যথাযথভাবে সমস্ত বিবৃতি চাওয়ার অনুমতি দেয়, তবে আমি মনে করি এটি ভাল ধারণা নয়: মাইএসকিউএলে জটিলতা বৃদ্ধি এবং লকিং ফাংশন বিবৃতি-ভিত্তিক প্রতিলিখনের জন্য নিরাপদ নয়।
যদি টেবিলের ডেটা টেবিল সংজ্ঞা আপগ্রেড থেকে বেঁচে থাকে ... সাধারণ ক্ষেত্রে এটি পার্থক্যগুলি খুঁজে পেতে এবং সঠিক ALTER ...বিবৃতি প্রদানের জন্য সারণী সংজ্ঞা তুলনা করার তুলনায় আরও জটিল গল্প , যা সর্বদা স্বয়ংক্রিয়ভাবে সম্ভব হয় না, যেমন কলামগুলির নাম পরিবর্তন করা হয়।
পার্শ্ব নোট 1:
আপনি একই পদ্ধতির সাহায্যে মতামত মোকাবেলা করতে পারেন, এক্ষেত্রে CREATE/DROP TABLEকেবল অপরিবর্তিত CREATE/DROP VIEWথাকাকালীন RENAME TABLEপরিবর্তিত হয়। আসলে আপনি এমনকি টেবিলটিকে দেখুন এবং বিপরীতে পরিণত করতে পারেন।
CREATE VIEW `foo__new` as ...; /* if not ok: terminate, report error */
RENAME TABLE `foo__new` to `foo`; /* if ok: terminate, report success */
RENAME TABLE `foo` to `foo__old`, `foo__new` to `foo`;
DROP VIEW IF EXISTS `foo__old`;
পার্শ্ব নোট 2:
মারিয়াডিবি ব্যবহারকারীদের সাথে খুশি হওয়া উচিত CREATE OR REPLACE TABLE/VIEW, যা ইতিমধ্যে বিষয় সমস্যা সম্পর্কে যত্নশীল এবং এটি সূক্ষ্ম পয়েন্টগুলি।