MySQL: Yeniden sıralama / otomatik artış birincil anahtarı Reset?

7 Cevap php

Ben masanın ortasında bazı satırları silinmiş ... otomatik artış birincil anahtarlar ile MySQL tablo var. Şimdi ben, örneğin, kimlik sütun gibi bir şey bu: 12, 13, 14, ... Ben 15, 16, 18 ve 19 satır 19, 20 silindi .... Ben reassing istiyorum / reset / sipariş birincil anahtarlar yüzden ... süreklilik yapmak var 19, 15, 20, 16 ve üzerinde ekmek ....

How can I do it??? Thanks.

7 Cevap

Sen birincil anahtar sütun bırakın ve yeniden oluşturabilirsiniz. Bütün kimlikleri daha sonra sırayla yeniden atanmış olmalıdır.

Ancak bu muhtemelen çoğu durumda kötü bir fikirdir. Eğer bu tabloya yabancı tuşları var diğer tabloları varsa, o zaman kesinlikle çalışmaz.

Bu soru oldukça eski gibi görünüyor olsa da, burada arama ulaşır birisi için bir cevap yayınlayacağız.

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

Sütun diğer tablolardaki yabancı anahtar olarak kullanıldığında ise, emin olun bu tablolardaki yabancı anahtar ilişkisi için ON UPDATE NO ACTION ON UPDATE CASCADE yerine varsayılan kullanımı yapmak.

Ayrıca, AUTO_INCREMENT sayımı sıfırlamak için, hemen aşağıdaki ifadeyi verebilir.

ALTER TABLE `users` AUTO_INCREMENT = 1;

MySQLs için MAX(id) + 1 değerini sıfırlamak olacaktır.

Sadece bu sorguyu kullanabilir

alter table abc auto_increment = 1;

Benim kullanıcı tablo kimliklerini sıfırlamak için, ben aşağıdaki SQL sorgusu kullanabilirsiniz. Bu herhangi bir diğer tablolar ile olabilecek herhangi bir ilişkileri berbat olacağını yukarıda söylenir.

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;

Yoksa, PhpMyAdmin gelen, "Autoıncrement" bayrağını kaldırarak kaydetmek, yeniden kurmak ve sıfırlamak save.this.

SET  @num := 0;

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

ALTER TABLE your_table AUTO_INCREMENT =1;

Ben bu bunu yapacağını düşünüyorum

Bunu sütunun birincil anahtar otomatik artış işlevselliğini kaldırmak olabilir, daha sonra bu sütun tablodaki tüm satırları sayacaktır elden önce bir sorgu çalıştırdığınızda güncelleme her zaman, daha sonra bir döngü çalıştırmak her değer ekleyerek bu satır sayısı dolaşır Sonunda kendi satır ve bu sütun, toplam satır sayısı artı biri olma değeri ile yeni bir satır ekleyerek bir sorguyu çalıştırın. Bu kusursuz çalışır ve size ne gerçekleştirmek için çalışan biri için en kesin çözüm olacaktır. Burada fonksiyon için kullanabilirsiniz kod bir örnektir:

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

İşte ben her satır 1 ile başlayan bir rütbe değer verdi bir seçme sorgusu, içinde sorgu ile bir rütbe sütun üzerinde ekli olan bir ilişkisel dizi oluşturduk. Daha sonra ilişkisel dizi yineledi.

Başka bir seçenek, satır sayısı almak temel bir seçme sorgusu çalıştırmak, ilişkisel dizi almak ve aynı yoldan ama her yineleme aracılığıyla güncelleştiren bir katma değişkeni ile yineleme olurdu. Bu az esnek ama aynı şeyi başarmak olacaktır.

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