2011-07-16 12 views
10

Mam galerię obrazów, do której członkowie witryny mogą przesyłać obrazy. Po przesłaniu obrazu zapisywany jest wiersz MySQL zawierający różne informacje o obrazie, elemencie itp. Ten wiersz używa AUTO_INCREMENT, aby utworzyć jego identyfikator, aby getimage.php?id=XX mógł pobrać obraz, który ma zostać wyświetlony.Jak ponownie przypisać kolumnę AUTO_INCREMENT dla każdego wiersza w tabeli MySQL przy użyciu PHP

Przeszukuję identyfikatory za pomocą pętli for, aby wyświetlać obrazy w galerii.

Jeśli usunę 5 wiersz/obraz, AUTO_INCREMENT przejdzie od 123456789 do 12346789.

Chciałbym ponownie przypisać identyfikator do każdego wiersza w tabeli MySQL, zaczynając od zera. Więc 12346789 staje się 12345678. Jak to osiągnąć?

+4

Jest to całkowicie niewłaściwy sposób, aby przejść o obsługę skasowanych zdjęć. Wystarczy wybrać potrzebne wiersze i przejrzeć je. –

+1

Dlaczego chcesz to zrobić? Oznacza to również, że musisz zaktualizować wszystkie linki do tych obrazów, aby upewnić się, że nadal masz prawidłowe obrazy. – Arjan

+1

O ile wiem, nie można tego zrobić, jeśli mimo to używasz automatycznego przyrostu. – Matt

Odpowiedz

15

Znalazłem to doskonale i dość szybko więc o to działa:

ALTER TABLE tablename DROP id 

ALTER TABLE tablename ADD id INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (id), AUTO_INCREMENT=1 

wiem, że to nie jest właściwe podejście jednak dla mojej konkretnej sytuacji to jest dokładnie to, co było potrzebne. W tabeli, której używałem, nie ma niczego, o czym mowa jest od albo do innej tabeli.

+0

Po prostu niesamowite, proste i proste rozwiązanie! Rozumiesz, dlaczego i jak to działa? Co robi "FIRST"? Och i poleciłbym zmianę 'INT' na' INT UNSIGNED' ... – Domi

11

Jeśli chcesz, aby auto-inkrementujące id do zawsze były następujące:, odejdź, to jest bezużyteczna walka.

Jeśli chcesz tylko zmienić numerację raz, to proste:

Utwórz nową tabelę z tego samego układu:

CREATE TABLE mytable2 LIKE oldtable; 

Kopiuj wszystkie wiersze do nowej tabeli, należy pamiętać, aby nie wybrać auto_incrementing id, w przeciwnym razie stara numeracja zostanie zachowana.

INSERT INTO mytable2 (field2, field3, field4) 
    SELECT field2, field3, field4 FROM oldtable ORDER BY oldtable.id; 

RENAME oldtable archive; 

RENAME mytable2 oldtable; 

DROP archive; 

Masz teraz kolejną numerację.

+0

To jest dobre podejście. Jest to bezpieczniejsze od zaakceptowanego rozwiązania z żywymi stołami, które mogą mieć dodatkową aktywność dodając do twojego stołu akumulacyjnego. W obu przypadkach rozsądne byłoby jednak zawarcie ich w transakcji nie przerywającej, jeśli jest dużo innych działań. I dla tego rozwiązania, RENAME oldtable zarchiwizowane; byłoby lepsze niż DROP. Możesz go upuścić, gdy będziesz pewien, że wszystko działa. –

1

Jako drugi już wspomniano, jest to złe podejście, ale w przypadku trzeba numeracji (to ważne dla kolumny sortowania na przykład), oto zapytanie:

UPDATE tabaleName SET fieldName = fieldName - 1 WHERE fieldName > 5 ORDER BY fieldName ASC 

A skoro używasz auto- inkrementacja, musisz go zresetować

ALTER TABLE tableName AUTO_INCREMENT=10000 

Ale proszę, zauważ, zamieszczam to tylko dla celów edukacyjnych. To jest zła podejście! Zamiast zapewniając dokładny identyfikator w zapytaniu po kliknięciu następny/poprzednie, wykonaj

SELECT * FROM tableName WHERE fieldName > _the_previous_id_ 
ORDER BY fieldName ASC LIMIT 1 

lub nawet lepiej, wybrać wszystkie rekordy w albumie, a pętla im.

+0

podwójnie zaznaczone. Jak mogę zapętlić rekordy z tabeli? – Drew

+0

ahh ok powinno to zrobić lewę WYBIERZ * Z tableName WHERE fieldName> _the_previous_id_ ORDER BY fieldName ASC LIMIT 1 to _the_poprzedni_id_ jest stałą lub czy zastąpiłbym ją moją zmienną $ id? – Drew

+0

Tak, to zmienna $ id –

Powiązane problemy