mysql silinen birincil anahtarları yeniden nasıl?

5 Cevap php

Ben de o otomatik artışlarla birincil anahtar bir mysql tablo 'id' adında bir sütun var.

i satırları silmek, onların id de böylece, örneğin, benim id dizisinde "delik" oluşturarak silinecektir.

Böylece 1, 2, 3, 9, 10, 30 ve

s: bu silinen id yeniden bir yolu var mı?

5 Cevap

Kullanımı:

ALTER TABLE [your table name here] AUTO_INCREMENT = 1

... Auto_increment değeri tablosundaki mevcut en yüksek mevcut değere göre yanında olmak için sıfırlanır. Yani, birden fazla boşlukları düzeltmek için kullanılabilir anlamına gelir.

Bunu yapmanın tek nedeni kozmetik olanlar için olacak - kayıtlar sıralı ise veritabanı bunlar bir sürekli başka ilgili sadece, umursamıyor. Veritabanının uğruna değerlerini "düzeltmek" için gerek yok.

Eğer onları her zaman sıralı olmak istiyorum neden olan kullanıcı için id değerlerini görüntüleyerek varsa, o zaman bir vekil anahtarı ekleyerek tavsiye ederim. Kullanıcıya görüntülenmesi için vekil tuşu, bu gerekli ama referencial bütünlüğü aksi etkilenmemiş olduğu gibi değerleri yeniden dizilenebilir. Bu durumda taşıyıcı anahtar bir tamsayı sütunu olacaktır.

Daha önce kullanılacak yanındaki anahtarı sıfırlamak için ALTER TABLE kullanın belirtildiği gibi, Bitirdikten sonra sonra (büyük bir veritabanı varsa, bu son derece yavaş ve verimsiz) onları yeniden adlandırmak için bir bash komut dosyası kullan

TARGET=1
for KEYS in `mysql --skip-column-names -u root --password=Password -D lookup -e "select id from tbl"` ; do
  mysql --skip-column-names -u root --password=Password -D lookup -e "update tbl set id='$TARGET' where id = '$KEYS'"
  TARGET=`expr $TARGET + 1`
  echo $TARGET
done

İki seçeneğiniz var:

  1. el kimliğini belirtmek (bu otomatik artış itibaren otomatik damla)
  2. TRUNCATE tablo - bu tablodaki tüm kayıtları siler

Bu satırları silerek oluşturulan "delik" yeniden her zaman kötü bir fikirdir, bu SO burada önce cevap oldu ama ben gidip bu soruyu bulmak için şu an çok uykum var.

Sen TABLO t2 AUTO_INCREMENT = 1 ALTER; 'deneyebilirsiniz

ALTER TABLE bazı notlar var:

  1. "Alter table" masa kilitli ve kilitsiz almak neden olabilir? Tablo düzey kilit çok innodb motoru için satır düzeyinde kilit etkileyebilir.
  2. The table will get unlocked after an alter , as MySQL says: http://dev.mysql.com/doc/refman/5.5/en/lock-tables.html If you use ALTER TABLE on a locked table, it may become unlocked. For example, if you attempt a second ALTER TABLE operation, the result may be an error Table 'tbl_name' was not locked with LOCK TABLES. To handle this, lock the table again prior to the second alteration. See also Section C.5.7.1, “Problems with ALTER TABLE”.
  3. 17 silinmediyse 15-17 arasında, örneğin, inter delikleri innodb On (16) geri olmayacaktır. ALTER TABLE table AUTO_INCREMENT =1, yalnızca geçerli uppest Otomatik artış kimliği aşağı düşüyor olacak.

Why recycle ID? Because ... For example i use InnoDB and have a stable structure of relation design on my db. So when i delete a parent item then the relative children will be removed automatically. It may be not about a table creating URLs based on the IDs and reusing an ID may have no effect on external systems such as the reports of google analytics. However the large projects have long IDs(such as post/status systems) will be backed up with a powerful archive mechanism and also the composite PK for the posts is something like timestamp+userid. But if we have a variable datatable which it's rows should be close to hand on an innodb(not in an archive table) the "alter table" may be a few risky. InnoDB is a wise choice when we're gonna update/insert tables frequently(row lock level) versus MyISAM(table lock level) which will be used for more steady datatables such as archives or country lists.

Solution : i'm ashamed , actually i had seen this question about 2 years ago when i was searching for a reason for "why we should keep the IDs increasable and we shouldn't recycle the IDs" and that time i have less time to answer. My solusion query for myself was (not recommended for long and busy tables) :

SELECT t1.ID-1 AS ID FROM $TableName AS t1 WHERE t1.ID>1 AND 0=(SELECT COUNT(t2.ID) FROM $TableName AS t2 WHERE t2.ID=t1.ID-1) LIMIT 1;

Biz PK ile çalışıyoruz, bu yüzden çünkü sorgu zaman makul olacaktır. Ancak durumlara dayalı, sorgu zaman değişken olabilir. ben bu sorgu hızı için yeterli testler yoktu ama ben 138.335 satır ile dünya kentlerinden bir MyISAM tablo üzerinde 0.00 bir deneyim oldu.

Bu sorgu kayıtları ve geri dönüşüm kimlik onlar için akıllıca bir eylem değildir milyonlarca aktif meşgul tablolar için olduğunu unutmayın.