Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][mysql] Auto_increment - jak zrobić aby automatycznie się zwiększało?
Forum PHP.pl > Forum > Bazy danych > MySQL
Setesh
Witam.

Stworzyłem sobie tabelkę z użytkownikami i ustawiłem user_id na auto_increment ale muszę sam zadbać aby wartość była zwiększana sad.gif

Wiecie jak zrobić aby samo się zwiększało i co ważniejsze - jak usunę rekord z userem to aby user_id które usunąłem było następnym razem wykorzystane?

kod :

  1. // tabelka user :
  2.  
  3. $query.="user_id MEDIUMINT NOT NULL AUTO_INCREMENT,";
  4. $query.="user_email VARCHAR(50) NOT NULL,";
  5. $query.="user_password CHAR BINARY NOT NULL,";
  6. $query.="user_name VARCHAR(30) NOT NULL,";
  7. $query.="user_country VARCHAR(50) NOT NULL,";
  8. $query.="user_profile TEXT NOT NULL,";
  9. $query.="user_registre_date TIMESTAMP(14) NOT NULL,";
  10. $query.="user_last_access_time TIMESTAMP(14),";
  11. $query.="PRIMARY KEY(user_id),";
  12. $query.="UNIQUE user_email(user_email, user_name)";
  13.  
  14.  
  15. // dopisanie usera - user_id jest wartością pobieraną na zasadzie ilości rekordów + 1
  16.  
  17. if($CanReg)
  18. {
  19. $res = mysql_query("SELECT * FROM user", $link_id);
  20. $num_rows = mysql_num_rows($res);
  21. $num_rows++;
  22. $Baza->InsertRecord('user', "'$num_rows', '$user_email', password('$user_pass'), '$user_name', '$user_country', '$user_profil', now(), curdate()");
  23. }


Możecie mi powiedzieć jak to zrobić aby nie sprawdzać user_id i nie wpisywać go tylko aby samo zostało nadane ?

przykład jak obecnie działa z usunięciem usera :

mamy 10 userów o id od 1 do 10 - usuwamy usera nr 8 - czyli następnym razem muszę dodać usera o id (ilosc_userów+1) - ale to wychodzi wtedy ze nowy user ma mieć nr 10 - a ostatni ma taki id już - lub usuwamy kilku userów ze środka tablicu (np o id 0d 4 do 7) - wtedy dodając usera znowu wywala błąd sad.gif

Myślałem ze auto_increment samo zwiększa liczbę a tu ni - zrobiłem coś źle ?
wookieb
Człowieku. OD wieeelu lat istnieje mysql i od wieeelu lat ludzie znają podstawy których TY nie masz. Ja pierdziele ludzie ruszajcie mózgiem bo jego zanik oznacza, że umieracie!
Jak masz tabele w której POLE ma właściwość auto_increment to przy insercie tej wartości W OGÓLE NIE WSTAWIASZ.
http://dev.mysql.com/doc/refman/5.0/en/exa...-increment.html
Setesh
Nie skomentuje tego co napisałeś ale powiedzmy że pomogłeś. Próbowałem bez wstawiania 1 elementu ale wywala błąd w składni mysql. mimo wszystko jedziesz po mnie z góry na dół tak jakbyś myślał że od lat w tym robię...

Problem nadal istnieje sad.gif
wookieb
No to sorry. Jeżeli nie kumasz manuala z jawnymi przykładami to nie mamy o czym rozmawiać. Pomijam fakt, że "błąd składni" bez podania zapytania nic nam nie mówi.
Setesh
Błąd dostaję : "Column count doesn't match value count at row 1"

Ok... patrząc na ten przykład rozumiem że przy wstawianiu do tabeli (tu animals) muszę podać miejsca w które chcę wstawić dane np : Insert into Tabela (pole1, pole2, pole4) przy czym pole 3 jest Auto... tak?
  1.  
  2. INSERT INTO animals (grp,name) VALUES
  3. ('mammal','dog'),('mammal','cat'),
  4. ('bird','penguin'),('fish','lax'),('mammal','whale'),
  5. ('bird','ostrich');
  6.  
wookieb
Tak. Jeżeli nie wstawiasz wartości to nawet nie wymieniasz kolumny na liście kolumn.
Wicepsik
Masz dwa wyjścia

  1. INSERT INTO tabela VALUES (NULL,'imie', 'nazwisko');
  2. INSERT INTO tabela (imie, nazwisko) VALUES ('imie', 'nazwisko');
Setesh
Dziękuję bardzo za pomoc ale jest mały problem...

skorzystałem z obu opcji ale za każdym razem jak kasuje użytkownika (np nr 2) i dodaję nowego to nr id skasowanego użytkownika nie jest już wykorzystywany...

I teraz pytanie... jeżeli bym robił np forum i ktoś kiedyś napisał wiadomość po czym usunął swoje konto to ok - wtedy jest informacja że skoro nie ma takiego id to user wykasował konto ale wiadomość zostaje z informacją że kiedyś user pod tym id napisał to. - takie rozwiązanie jest sensowne - aby nie było wykorzystywane id które nie jest używane. Problem że kiedy dodaję do bazy informację (np marki aut) i wykasuję potem jedną bo np pomyliłem się to taki id jak zadziała w chwili kiedy będę chciał np przejechać się po tabeli aby wychwycić wszystkie marki ? Nie wywali mi to błędu w skrypcie z info że takie id nie istnieje ?
karolo_k
No tak auto_increment samo ma zmieniać numer ID na kolejny.
  1. #
  2. $query.="user_id MEDIUMINT NOT NULL AUTO_INCREMENT,";

Zamień na
  1. #
  2. $query.="user_id INT NOT NULL AUTO_INCREMENT,";

I w strukturze tabeli tez musisz ustalic na INT

Tu masz przykład z mojego pliku account.sql
  1. `ID` int(11) NOT NULL AUTO_INCREMENT,
  2. `email` varchar(25) NOT NULL,
thek
Auto_increment nie uzupełnia luk. Jeśli więc usuniesz kolesia z bazy, to mysql nie załata dziury po nim. A czemu? Wyobraź sobie, że masz tabelę, która łączy się z inną. Usuwasz sobie ze środka jakiś rekord, baza przesuwa rekordy by dziurę załatać. W tym momencie całą zależną tabelę szlag trafia bo id-ki się nie zgadzają z powodu przesunięcia. Również je musiałbyś zmienić na pasujące.

Co do marek, to próba usunięcia rekordu który posiada jakieś powiązania z innymi tabelami powinna Ci się nie powieść. I sama baza MA takie mechanizmy przy definiowaniu kluczy obcych w tabelach. Warto poczytać co dają takie konstrukcje jak ON DELETE, ON UPDATE czy ON INSERT dla kluczy.
wookieb
Cytat(thek @ 25.01.2011, 23:27:19 ) *
Auto_increment nie uzupełnia luk. Jeśli więc usuniesz kolesia z bazy, to mysql nie załata dziury po nim. A czemu? Wyobraź sobie, że masz tabelę, która łączy się z inną. Usuwasz sobie ze środka jakiś rekord, baza przesuwa rekordy by dziurę załatać. W tym momencie całą zależną tabelę szlag trafia bo id-ki się nie zgadzają z powodu przesunięcia. Również je musiałbyś zmienić na pasujące.

Co nie znaczy, że jest to niemożliwe. Głupie ale możliwe (ale nie za pomocą auto_increment)
thek
Nie mówiłem, że jest to niemożliwe. Ale dbanie o to, by pomiędzy powiązanymi tabelami była zgodność wymaga jednak trochę myślenia i wiedzy, a to w obecnych czasach deficytowe rzeczy winksmiley.jpg Inna sprawa, że ta dbałość najpewniej nie była by wydajna i z czasem wręcz by baze mogła zajechać. Lepiej zostawić jak jest i tak pisać aplikację, by dziury nie miały wpływu na jej działanie, co zazwyczaj daje się prosto osiągnąć. Jak sam stwierdziłeś, dbanie o ciągłość id-eków jest
Cytat
Głupie ale możliwe
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.