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




mysql tutorial (12)

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, ইত্যাদি।

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


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

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


সর্বোত্তম পছন্দ হল কলাম পরিবর্তন এবং 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;

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


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


আমার মতামত 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)));
        }
    }
}

phpmyadmin মধ্যে

নোট: যদি আপনি শেষ সারিগুলি মধ্যম সারি না মুছে ফেলেন তবে এটি কাজ করবে।

আপনার টেবিলে গিয়েছিলাম-> অপারেশন মেনুতে ক্লিক করুন-> Goto টেবিল বিকল্পগুলি-> অটোওস্ক্রীমেন্ট পরিবর্তন করুন যেখান থেকে আপনি শুরু করতে চান।

আপনার টেবিল autoincrement যে কোন থেকে শুরু।

এটা চেষ্টা করুন।


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

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 পুনরায় সেট করবে।


আমার ব্যবহারকারীর টেবিলের আইডি রিসেট করার জন্য, আমি নিম্নোক্ত 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;

আপনি কেবল এই প্রশ্নের ব্যবহার করতে পারেন

alter table abc auto_increment = 1;

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

$table_row_count = mysql_result(mysql_query("SELECT COUNT(`field_1`) FROM `table`"), 0);
$viewsrowsdata = mysql_query("
    SELECT `rank`, `field1`, `field2`, `field3`, `field4`
        FROM (SELECT (@rank:[email protected]+1) as `rank`, `field1`, `field2`, `field3`, `field4`
            FROM (SELECT * FROM `views`) a
            CROSS JOIN (SELECT @rank:=0) b
            ORDER BY rank ASC) c
");
while ($row = mysql_fetch_assoc($viewsrowsdata)) {
    $data[] = $row;
}
foreach ($data as $row) {
    $new_field_1 = (int)$row['rank'];
    $old_field_1 = (int)$row['field1'];
    mysql_query("UPDATE `table` SET `field_1` = $new_field_1 WHERE `field_1` = $old_field_1");
}
mysql_query("INSERT INTO `table` (`field1`, `field2`, `field3`, `field4`) VALUES ('$table_row_count' + 1, '$field_2_value', 'field_3_value', 'field_4_value')");

এখানে আমি একটি অ্যাসোসিয়েটেড অ্যারে তৈরি করেছি যা আমি একটি র্যাঙ্ক কলামে একটি ক্যোয়ারী দিয়ে প্রশ্নযুক্ত একটি প্রশ্নের সাথে যুক্ত করেছি, যা প্রতিটি সারিকে 1 দিয়ে শুরু করে একটি র্যাঙ্ক মান দেয়। তারপর আমি অ্যাসোসিয়েটেড অ্যারের মাধ্যমে পুনরাবৃত্তি করেছিলাম।

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

$table_row_count = mysql_result(mysql_query("SELECT COUNT(`field_1`) FROM `table`"), 0);
$viewsrowsdata = mysql_query("SELECT * FROM `table`");
$updated_key = 0;
while ($row = mysql_fetch_assoc($viewsrowsdata)) {
    $data[] = $row;
}
foreach ($data as $row) {
    $updated_key = $updated_key + 1;
    mysql_query("UPDATE `table` SET `field_1` = '$updated_key' WHERE `field_1` = '$row['field_1']'");
}
mysql_query("INSERT INTO `table` (`field1`, `field2`, `field3`, `field4`) VALUES ('$table_row_count' + 1, '$field_2_value', 'field_3_value', 'field_4_value')");




database