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


127

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

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

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

উত্তর:


95

আপনি প্রাথমিক কী কলামটি বাদ দিয়ে আবার তৈরি করতে পারেন। সমস্ত আইডির পরে ক্রমে পুনরায় নিয়োগ করা উচিত।

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


আমার কাছে অন্যান্য টেবিল রয়েছে যা এই টেবিলের জন্য একটি বিদেশী কী রাখে, তবে আমি কেবল প্রকল্পটি শুরু করছি যাতে এটি আমার পক্ষে ঠিক আছে .. ধন্যবাদ!
জোনাথন

65
এটি সেরা দীর্ঘমেয়াদী হতে পারে যদি আপনি চেষ্টা করেন এবং স্বীকার করতে শুরু করেন যে আপনার আইডিগুলি সর্বদা অনুক্রমিক হয় না, অন্যথায় আপনি যখন বড় প্রকল্পগুলিতে কাজ শুরু করেন এটি সত্যই পাগল হয়ে যায়!
সিয়ানান ম্যাকনল্ট্রি

8
আপনার_সারণযোগ্য আউটপুট ক্রমটি টেবিল করুন = 1
সিনাক

356

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

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

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

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

ALTER TABLE `users` AUTO_INCREMENT = 1;

মাইএসকিউএলগুলির জন্য এটিতে মানটি পুনরায় সেট করবে MAX(id) + 1


বিদেশী কী সহ এটি আমার টেবিলের জন্য খুব শীতল সমাধান যেখানে প্রচুর জাঙ্ক sertedোকানো এবং মুছে ফেলা হয় এবং আমি সূচী স্থানটি সংরক্ষণ করতে চাই।
মুকুন্ডা

1
মাইএসকিউএল ডক এর বিপরীতে পরামর্শ দেয়: "একটি সাধারণ নিয়ম হিসাবে, এসইটি স্টেটমেন্টগুলি ব্যতীত আপনার কোনও ব্যবহারকারীর ভেরিয়েবলের জন্য কোনও মান কখনই অর্পণ করা উচিত নয় এবং একই স্টেটমেন্টের মধ্যে থাকা মানটি পড়তে হবে না example উদাহরণস্বরূপ, একটি ভেরিয়েবল বৃদ্ধি করার জন্য এটি ঠিক আছে: সেট @a = @a + 1; অন্যান্য বিবৃতিগুলির জন্য, যেমন নির্বাচন করুন, আপনি প্রত্যাশিত ফলাফল পেতে পারেন, তবে এটির গ্যারান্টি নেই: নীচের বিবৃতিতে, আপনি মাইএসকিউএল প্রথমে @a কে মূল্যায়ন করবেন এবং তারপরে একটি অ্যাসাইনমেন্ট করবেন দ্বিতীয়: নির্বাচন @ এ, @ এ: = @ এ + ১, ...; তবে, ব্যবহারকারী ভেরিয়েবলগুলির সাথে জড়িত অভিব্যক্তিগুলির জন্য মূল্যায়নের
ক্রমটি পূর্বনির্ধারিত

3
@ রিভার্সেমএফ: ন। অ্যাসাইনমেন্টের ক্রমটি মাইএসকিউএল এক্সপ্রেশনগুলিতে স্থির হয়েছে। আপনি যা উদ্ধৃত করেছেন তা থেকে মাইএসকিউএল ডকুমেন্টেশন ভেরিয়েবলের একাধিক স্বতন্ত্র ব্যবহারের বিরুদ্ধে পরামর্শ দেয়। উপরের ক্ষেত্রে, একক অ্যাসাইনমেন্ট এক্সপ্রেশন `` ব্যবহারকারীদের .আইডি = @ অ্যাকাউন্ট: = @ অ্যাকাউন্ট + 1` এর কারণে এক্সপ্রেশনটির মূল্যায়ন পূর্বনির্ধারিত ক্রমে সংঘটিত হতে বাধ্য ` ডকুমেন্টেশন থেকে: "ডানদিকে মানটি একটি আক্ষরিক মান হতে পারে, অন্য একটি পরিবর্তনশীল একটি মান সংরক্ষণ করে, বা কোনও আইনী অভিব্যক্তি যা একটি ভাস্কর মান দেয়"
আনশুল

1
এটি কি খুব ব্যয়বহুল বক্তব্য? এটি একটি বহু গিগাবাইট টেবিলে কীভাবে সম্পাদন করবে? আমি আমার ইবদাটা 1 (দীর্ঘ লেনদেন) উড়িয়ে দেওয়ার এবং টেবিলটি খুব বেশি সময়ের জন্য অবরুদ্ধ করার ভয় পাচ্ছি।
স্টিফান

1
@ স্টেফান একটি টেবিলের (5MB) বিদেশী কীগুলির সাথে অন্য 2 + জিবি ডেটা উল্লেখ করে, এই স্ক্রিপ্টটি পাঁচ মিনিটেরও বেশি সময় নেয়নি। সিস্টেমটির একটি এসএসডি রয়েছে, সুতরাং আমি মনে করি এটি অনেক সাহায্য করেছে। এফকে অন-আপডেট ক্যাসকেড ছিল
ফার্নান্দেজার

60

আমার ব্যবহারকারীর টেবিলের আইডি পুনরায় সেট করতে আমি নিম্নলিখিত এসকিউএল কোয়েরিটি ব্যবহার করি। উপরে বলা হয়েছে যে এটি অন্য কোনও টেবিলের সাথে আপনার যে সম্পর্ক রাখতে পারে তা নষ্ট করে দেবে।

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;

584k সারি সহ একটি মাইআইএসএএম টেবিলে এটি প্রায় 7.3 সেকেন্ড সময় নিয়েছিল।
ব্যবহারকারী 1278519

3
যদি আমার 100 টি ভোট হয় তবে আমি আমার সর্বদা এটির মত ভোট দিতাম যেহেতু এটি আমার মতো
কোনও নুবির জন্য বর্গ বক্তব্যগুলি

1
দ্বিতীয় লাইনের দরকার নেই নাকি আমি ভুল করছি? এটি নিজের থেকে 1 দ্বারা শুরু হয় ,,,, InnoDB এর জন্য এটি আমার পক্ষে করেছিল
থাইলিকুল

দ্বিতীয় লাইন প্রয়োজন হয় না।
কাওয়াইএক্সএক্স

1
@ জর্জি অগস্টো মুররেডমৌড়া রেকর্ডগুলির ক্রম পরিবর্তন করা হবে না
রায়ান

31

আপনি কেবল এই ক্যোয়ারীটি ব্যবহার করতে পারেন

alter table abc auto_increment = 1;

2
এটি এই ক্ষেত্রে কাজ করবে না। ইসম টেবিলগুলির জন্য, এটি অটোয়েন্টক মানটি সর্বোচ্চ (আইডি) + ১ এ সেট করবে In ইনোডিবি-র জন্য এটি কিছুই করবে না। AUTOINCREMENT পরিবর্তন করার জন্য দ্বিতীয় টেবিল ডক্স দেখুন dev.mysql.com/doc/refman/5.0/en/alter-table.html
lreeder

3
5.6 থেকে @Ireeder অগ্রে InnoDB জন্য আচরণ myisam যে অনুরূপ
Anshul

আপনার যদি অন্য টেবিলগুলির কাছে এই টেবিলের বিদেশী কী রয়েছে তবে এটি কী তাদের ভেঙে দেবে?
কাইল ভ্যাসেলা

15
SET  @num := 0;

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

ALTER TABLE your_table AUTO_INCREMENT =1;

আমি মনে করি এটি এটি করবে


12

অথবা, পিএইচপিএমআইএডমিন থেকে, "অটোআইক্রেনমেন্ট" পতাকাটি সরান, সংরক্ষণ করুন, আবার সেট করুন এবং সেভ করুন.এটি পুনরায় সেট করে।


দুঃখিত, আমি বর্তমান phpmyadmin সংস্করণ দিয়ে পরীক্ষা করতে পারবেন না। আমার উত্তরটি বেশ পুরানো ... আপনি যদি আমাকে হতাশ করেন, আপনি কি দয়া করে এটি সংশোধন করতে পারেন?
lbrutti

3
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


1

phpmyadmin এ

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

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

আপনার টেবিল স্বতঃসংশোধন যে নম্বর থেকে শুরু।

এটি চেষ্টা করুন। এখানে চিত্র বর্ণনা লিখুন


0

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

$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:=@rank+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 দিয়ে শুরু করে একটি র‌্যাঙ্কের মান দিয়েছিল then আমি তখন অ্যাসোসিয়েটিভ অ্যারের মাধ্যমে পুনরাবৃত্তি করি।

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

$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')");

0

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

SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS ;
SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION ;
SET NAMES utf8 ;
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 ;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 ;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' ;
SET @OLD_SQL_NOTES=@@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=@OLD_SQL_MODE ;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS ;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS ;
SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT ;
SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS ;
SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION ;
SET SQL_NOTES=@OLD_SQL_NOTES ;

0

আমারও একই সন্দেহ ছিল, তবে টেবিলে কোনও পরিবর্তন করতে পারিনি, আমি নিম্নলিখিতটি করার সিদ্ধান্ত নিয়েছিলাম আমার আইডিটি ভেরিয়েবল @ অ্যাকাউন্টে নির্ধারিত সর্বাধিক সংখ্যার বেশি না হলে:

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

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

ALTER TABLE `users` AUTO_INCREMENT = 1;

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


0

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


0

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

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)));
        }
    }
}

0

এটি কাজ করে - https ://stackoverflow.com/a/5437720/10219008..... তবে আপনি যদি কোনও সমস্যাটিতে চালিত হন 'ত্রুটি কোড: 1265. কলাম' আইডির জন্য সারি 1 'তে ডেটা কেটে গেছে ... তারপরে চালান পরবর্তী. আপডেট ক্যোয়ারিতে উপেক্ষা যুক্ত করা হচ্ছে।

SET @count = 0;
set sql_mode = 'STRICT_ALL_TABLES';
UPDATE IGNORE web_keyword SET id = @count := (@count+1);

-2

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

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


1
... আপনি এটি কি ভিত্তি করে? সম্ভবত কেবল "সম্পূর্ণ_ ব্যবহারকারী_ইনফো_এক্সপোর্ট.এফপি? ইউজারিড = 34" এর মতো পৃষ্ঠা তৈরি করবেন না? অভ্যন্তরীণভাবে একটি স্ট্রিং বা অন্যান্য এলোমেলো মান সূচক / সনাক্তকারী হিসাবে ব্যবহার করা সত্যিই খারাপ ধারণা। এটি সমাধানের চেয়ে আরও সমস্যা তৈরি করে (এটি যদি কোনও সমস্যার
রব

MD5 মানটি চূড়ান্ত খারাপ সম্ভাবনা কারণ এটি সম্ভব যে দুটি পৃথক মান বা ডেটাসেট একই MD5 মান উত্পাদন করে। সুতরাং আমি এটিকে কোনও সমাধান বলব না।
ডেভিড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.