2011-06-17 12 views
5

Moja tabela db wygląda tak, jak na zdjęciu. http://prntscr.com/22z1nProblem z automatycznie zwiększaną kolumną "id"

Ostatnio stworzyłem stronę delete.php. działa poprawnie, ale po usunięciu 21-tego użytkownika kolejny zarejestrowany użytkownik otrzymuje 24-ty identyfikator zamiast 21.

Czy możliwe jest umieszczenie nowo zarejestrowanych użytkowników w pierwszym pustym wierszu? (W tej sytuacji 21 wiersz)

W moim formularzu rejestracyjnym, nowo zarejestrowany użytkownik może pisać nazwiska istniejących użytkowników i być z nimi po rejestracji. Dla tej przyjaźni mam kolejną tabelę, która kojarzy identyfikator nowo zarejestrowanego użytkownika i istniejącego użytkownika.

W tym celu używam mysql_insert_id podczas rejestracji, aby uzyskać identyfikator dla nowego użytkownika. Ale po skasowaniu 21 wiersza podczas procesu rejestracji Nex mysql_insert_id dał mi numer 21., ale przechowywany w 24. wierszu. I wstaw do tabeli powiązań 21 dla nowego użytkownika. Chcę rozwiązać ten problem

+0

Być może nie rozumiesz 'mysql_insert_id()'. Zwraca wprowadzony identyfikator LAST. Powołanie go wielokrotnie spowoduje, że zawsze zwrócisz ostatnią, nigdy następną. Jego wartość nie zmieni się, dopóki nie zostanie ukończona kolejna wstawka. –

Odpowiedz

2

Kolumna MySQL auto_increment utrzymuje wewnętrznie liczbę i zawsze ją zwiększa, nawet po usunięciu. Jeśli musisz wypełnić puste miejsce, musisz obsłużyć to samodzielnie w PHP, zamiast używać słowa kluczowego auto_increment w definicji tabeli.

Wycofywanie się w celu wypełnienia pustych identyfikatorów w wierszach może powodować różnego rodzaju trudności, jeśli utrzymujesz relacje z kluczem obcym i naprawdę nie jest to zalecane.

Wartość auto_increment można zresetować za pomocą instrukcji SQL, ale nie jest to zalecane, ponieważ spowoduje to zduplikowanie kluczowych błędów.

-- Doing this will cause problems! 
ALTER table AUTO_INCREMENT=12345; 

EDIT egzekwowania swoich relacji klucza obcego w sposób opisany w komentarzach, należy dodać do definicji tabeli:

FOREIGN KEY (friendid) REFERENCES registration_table (id) ON DELETE SET NULL; 

wypełnienie poprawnych nazw tabel i kolumn. Teraz, gdy użytkownik zostanie usunięty z rejestracji, jego znajomy skojarzenie jest zerowane. Jeśli potrzebujesz ponownie powiązać z innym użytkownikiem, należy to zrobić za pomocą PHP. mysql_insert_id() nie jest już pomocna.

Jeśli chcesz znaleźć identyfikator o najwyższym numerze nadal w bazie danych po skasowaniu, aby skojarzyć go z przyjaciółmi, użyj następującego polecenia.

SELECT MAX(id) FROM registration_table; 
+0

Czy mogę to zrobić z mysql_insert_id? –

+0

@ Tural Teyyuboglu: mysql_insert_id() pobiera identyfikator ostatniej wstawki. Jeśli zwiększysz i zapiszesz tę wartość, możesz użyć jej ponownie do następnej wstawki. Chociaż byłoby to niepotrzebne, ponieważ znasz już identyfikator użyty podczas ostatniego wstawienia. –

+0

@ Tural Teyyuboglu Nie, ponieważ 'mysql_insert_id' pobiera tylko ostatnio używany ID. –

3

Podczas korzystania z kolumny autoinkrementacji wartość, do której zostanie przypisany następny wpis, nie zostanie zmniejszona poprzez usunięcie wpisu. Nie do tego służy kolumna autoinkrementacji. Mechanizm bazy danych zawsze zwiększa ten numer na nowej wstawce i nigdy nie zmniejsza tego numeru podczas usuwania.

2

Auto increment to klucz sekwencji śledzony jako część tabeli. Nie powraca po usunięciu wiersza.

+1

proszę pomóż mi zrealizować mój pomysł –

1

Łatwo, nie. Co możesz zrobić (ale nie sugeruję, aby to zrobić) tworzy funkcję SQL, aby określić najniższą liczbę, która nie jest aktualnie zajęta. Możesz także utworzyć tabelę identyfikatorów, które zostały usunięte, i pobrać z niej najmniejszą liczbę. Albo, i to jest najlepszy pomysł, zignoruj ​​luki i zdaj sobie sprawę, że baza danych jest w porządku.

1

To, co chcesz zrobić, można osiągnąć, dodając do tabeli dodatkową kolumnę o nazwie coś w rodzaju user_order.Następnie możesz napisać kod, aby zarządzać wstawkami i usunięciami, tak aby ta kolumna była zawsze sekwencyjna bez przerw.

W ten sposób unikasz problemów, które mogą powodować problemy z kolumną auto_increment.

1

To nie jest dobra praktyka, aby wyzerować wartość auto_increment, ale czy naprawdę trzeba to zrobić, więc można:

ALTER TABLE mytable AUTO_INCREMENT = 1; 

uruchomić tę kwerendę po każdym usunąć. Auto_Inrement wartość nie zostanie ustawiona na 1, to ustawi najniższą możliwą wartość automatycznie.

+1

dlaczego uważasz, że jest dobry? –

+0

@Tural, Załóżmy, że masz table1 i table2. table2 ma klawisz przedniego do table1. Powiedzmy, że usuniesz coś z tabeli 1, a następnie dodasz nowy wiersz do tej samej tabeli. Tak więc nowy wiersz otrzymuje ten sam identyfikator co usunięty wiersz. Ale teraz możemy mieć sytuację, gdy wiersz w tabeli2 wskazuje na nasz nowy wiersz w tabeli1. Wcześniej ten wiersz wskazywał na nasz usunięty wiersz, a teraz wskazuje na nowy wiersz. Więc jak widzisz, to jest OK. – Karolis

+0

@Tural, przepraszam, w moim ostatnim zdaniu chciałem powiedzieć, że to nie jest OK. Ale myślę, że zrozumiałeś :) – Karolis

Powiązane problemy