mysql - tutorial - পুনঃক্রম/স্বয়ংক্রিয় বৃদ্ধি প্রাথমিক কী পুনরায় সেট করুন




mysql tutorial (10)

InnoDB এর জন্য, এটি করুন (এটি একটি টেবিল থেকে সমস্ত রেকর্ড মুছে ফেলবে, প্রথমে একটি বাক্কাপ তৈরি করুন):

SET @OLD_CHARACTER_SET_RESULTS[email protected]@CHARACTER_SET_RESULTS ;
SET @OLD_COLLATION_CONNECTION[email protected]@COLLATION_CONNECTION ;
SET NAMES utf8 ;
SET @OLD_UNIQUE_CHECKS[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0 ;
SET @OLD_FOREIGN_KEY_CHECKS[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 ;
SET @OLD_SQL_MODE[email protected]@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' ;
SET @OLD_SQL_NOTES[email protected]@SQL_NOTES, SQL_NOTES=0 ;
/* ================================================= */

drop table tablename;
CREATE TABLE `tablename` (
   table structure here!

) ENGINE=InnoDB AUTO_INCREMENT=  ai number to reset  DEFAULT CHARSET= char set here;



/* ================================================= */
SET SQL_MODE[email protected]OLD_SQL_MODE ;
SET FOREIGN_KEY_CHECKS[email protected]OLD_FOREIGN_KEY_CHECKS ;
SET UNIQUE_CHECKS[email protected]OLD_UNIQUE_CHECKS ;
SET CHARACTER_SET_CLIENT[email protected]OLD_CHARACTER_SET_CLIENT ;
SET CHARACTER_SET_RESULTS[email protected]OLD_CHARACTER_SET_RESULTS ;
SET COLLATION_CONNECTION[email protected]OLD_COLLATION_CONNECTION ;
SET SQL_NOTES[email protected]OLD_SQL_NOTES ;

আমি একটি স্বয়ংক্রিয় বৃদ্ধি প্রাথমিক কী সঙ্গে একটি MySQL টেবিল আছে। আমি টেবিল মাঝখানে কিছু সারি মুছে ফেলা। এখন আমি উদাহরণস্বরূপ, আইডি কলামে এরকম কিছু করেছি: 12, 13, 14, 19, ২0। আমি 15, 16, 17 এবং 18 সারি মুছে ফেলেছি।

আমি প্রাথমিক কী পুনরায় সেট / পুনরায় সেট / পুনর্গঠন করতে চাই যাতে আমার ধারাবাহিকতা থাকে, অর্থাৎ 19 একটি 15, 20 একটি 16, ইত্যাদি।

আমি এটা কিভাবে করবো?


অথবা, PhpMyAdmin থেকে, "স্বয়ংক্রিয় ইনক্রিমমেন্ট" পতাকাটি সরিয়ে ফেলুন, সংরক্ষণ করুন, এটি আবার সেট করুন এবং সংরক্ষণ করুন। এটি রিসেট করে।


আপনি কেবল প্রাথমিক কী হিসাবে সাংখ্যিক আইডি ব্যবহার করা এড়াতে পারেন। যদি টেবিল দেশগুলির তথ্য থাকে তবে আপনি দেশ কোডগুলি প্রাথমিক আইডি হিসাবে ব্যবহার করতে পারেন, অথবা উদাহরণস্বরূপ নিবন্ধগুলি ধরে থাকলে আপনি পারমলিংক ব্যবহার করতে পারেন।

আপনি কেবল একটি এলোমেলো, অথবা একটি MD5 মান ব্যবহার করতে পারে। এই সমস্ত বিকল্পগুলির নিজস্ব সুবিধা রয়েছে, বিশেষ করে আইটি সেকেন্ডে। সংখ্যাসূচক আইডি গণনা করা সহজ।


আপনি প্রাথমিক কী কলামটি ছাড়তে এবং এটি পুনরায় তৈরি করতে পারেন। সমস্ত আইডি তারপর ক্রম reassigned করা উচিত।

তবে এই সম্ভবত বেশিরভাগ পরিস্থিতিতে একটি খারাপ ধারণা। যদি আপনার কাছে এই টেবিলে বিদেশী কীগুলির অন্যান্য টেবিল থাকে তবে এটি অবশ্যই কাজ করবে না।


আমার ব্যবহারকারীর টেবিলের আইডি রিসেট করার জন্য, আমি নিম্নোক্ত SQL ক্যোয়ারী ব্যবহার করি। উপরে বলা হয়েছে যে এটি অন্য কোনও সারণীর সাথে আপনার সম্পর্ককে ধ্বংস করবে।

ALTER TABLE `users` DROP `id`;
ALTER TABLE `users` AUTO_INCREMENT = 1;
ALTER TABLE `users` ADD `id` int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;

আমার মতামত row_order নামক একটি নতুন কলাম তৈরি করা হয়। তারপর যে কলাম reorder। আমি প্রাথমিক কী পরিবর্তনগুলি গ্রহণ করছি না। উদাহরণস্বরূপ, যদি অর্ডার কলামটি banner_position হয়, তবে আমি এটির মতো কিছু করেছি, এটি মুছে ফেলার, আপডেট করা, ব্যানার অবস্থান কলাম তৈরির জন্য। এই ফাংশন কল তাদের যথাক্রমে reorder।

public function updatePositions(){
    $offers = Offer::select('banner_position')->orderBy('banner_position')->get();
    $offersCount = Offer::max('banner_position');
    $range = range(1, $offersCount);

    $existingBannerPositions = [];
    foreach($offers as $offer){
        $existingBannerPositions[] = $offer->banner_position;
    }
    sort($existingBannerPositions);
    foreach($existingBannerPositions as $key => $position){
        $numbersLessThanPosition = range(1,$position);
        $freshNumbersLessThanPosition = array_diff($numbersLessThanPosition, $existingBannerPositions);
        if(count($freshNumbersLessThanPosition)>0) {
            $existingBannerPositions[$key] = current($freshNumbersLessThanPosition);
            Offer::where('banner_position',$position)->update(array('banner_position'=> current($freshNumbersLessThanPosition)));
        }
    }
}

যদিও এই প্রশ্নটি বেশ পুরানো বলে মনে হচ্ছে, এখানে অনুসন্ধানে পৌঁছানোর জন্য এমন কেউ উত্তর দেবে।

SET @count = 0;
UPDATE `users` SET `users`.`id` = @count:= @count + 1;

কলামটি অন্য টেবিলে বিদেশী কী হিসেবে ব্যবহৃত হলে, আপনি সেই টেবিলগুলিতে বিদেশী কী সম্পর্কের জন্য ডিফল্ট ON UPDATE CASCADE পরিবর্তে ON UPDATE CASCADE ব্যবহার করুন তা নিশ্চিত করুন।

উপরন্তু, AUTO_INCREMENT গণনা পুনরায় সেট করার জন্য, আপনি অবিলম্বে নিম্নলিখিত বিবৃতিটি ইস্যু করতে পারেন।

ALTER TABLE `users` AUTO_INCREMENT = 1;

MySQLs এর জন্য এটি মানটি MAX(id) + 1 পুনরায় সেট করবে।


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


SELECT * from `user` ORDER BY `user_id`; 

SET @count = 0;

UPDATE `user`  SET `user_id` = @count:= @count + 1;

ALTER TABLE `user_id` AUTO_INCREMENT = 1;

যদি আপনি order by করতে চান


SET  @num := 0;

UPDATE your_table SET id = @num := (@num+1);

ALTER TABLE your_table AUTO_INCREMENT =1;

আমি এটা করতে হবে মনে হয়





database