2010-02-18 9 views
11

Mam kolumnę o nazwie "id" w tabeli mysql, która jest również kluczem głównym, który automatycznie zwiększa.jak ponownie wykorzystać usunięte klucze główne w mysql?

po usunięciu wierszy ich identyfikatory zostaną również usunięte, tworząc "dziury" w mojej sekwencji id, np.

1, 2, 3, 9, 10, 30 i tak dalej

istnieje sposób ponowne usuniętych id: s?

+0

Dlaczego chcesz to zrobić? –

+0

ponieważ używam "id" jako nazwy dla wierszy (linków). więc nie chcę tych nazw, np. skakać od 5 do 23 pozostawiając dużą dziurę pomiędzy. – ajsie

+4

Nie używaj w tym swojej tożsamości. Nazwij wiersze podczas wyświetlania, w ten sposób oddzielasz wizualny numer wiersza od wewnętrznego klucza bazy danych. – Joe

Odpowiedz

10

Zastosowanie:

ALTER TABLE [your table name here] AUTO_INCREMENT = 1 

... kasuje wartość auto_increment być następnym na podstawie najwyższej istniejącej wartości istniejącej w tabeli. Oznacza to, że nie można go użyć do skorygowania przerw w więcej niż jednym.

Jedyny powód, aby to zrobić, dotyczy kosmetyków - baza danych nie dba o to, czy rekordy są sekwencyjne, tylko o to, że odnoszą się do siebie konsekwentnie. Nie ma potrzeby "poprawiania" wartości dla bazy danych.

Jeśli wyświetlasz użytkownikom wartości id, dlatego chcesz, aby zawsze były sekwencyjne, zalecamy dodanie klucza zastępczego. Użyj klucza zastępczego do wyświetlenia użytkownikowi, aby można było w razie potrzeby powtórzyć sekwencję, ale nienaruszona jest integralność referencyjna. Klucz zastępczy w tym przypadku byłby kolumną całkowitą.

+0

Może to być przydatne w środowisku testowym. – Michael

1

Masz dwie opcje:

  1. ręcznie podać ID (to krople auto z automatycznego przyrostu)
  2. TRUNCATE stół - Spowoduje to usunięcie wszystkich rekordów w tabeli

To zawsze zły pomysł, aby ponownie wykorzystać "dziury" utworzone przez usunięcie wierszy, na to odpowiedziano w SO, ale jestem teraz zbyt śpiący, aby znaleźć to pytanie.

+0

Jak mogę ręcznie określić najniższy identyfikator? mógłbyś mi pokazać kod php? – ajsie

+0

@Name: Tak jak powiedziałem w swojej odpowiedzi, nie powinieneś tego robić, "dziury", jak ci się powtarza, aby zapewnić integralność danych (relacji), jeśli nie chcesz mieć luk w swoim stole, będziesz lepszy ustawienie kolumny flagi "usunięta" w tabeli, gdy chcesz usunąć rekord zamiast wydać polecenie SQL "DELETE". –

+0

Używam id jako nazwy linku ... tak, chcę, żeby nie mieć dużych skoków między liczbami ... myślę, że źle ręcznie określ identyfikator. – ajsie

1

Możesz wypróbować "ALTER TABLE t2 AUTO_INCREMENT = 1;"

+0

Pracował dla mnie na MySQL 4.1, ale widzę moją odpowiedź na temat jej możliwości, które mogą nie pasować do zamierzonego użycia. –

2

pomocą skryptu bash do ich nazwy (jest to bardzo powolny i nieskuteczny, jeśli masz dużą bazę danych) Następnie, po zakończeniu, jak wspomniano wcześniej użyć ALTER TABLE zresetować następny klucz do wykorzystania

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 
Powiązane problemy