Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]Mysql jak sprawdzic ID rekordów ktore usunołem
Forum PHP.pl > Forum > Przedszkole
set4812
Pisze forum i mam tabele kategorie i gdy chce usunac kategorie automatycznie usuwam wszystkie dzialy bo tabele sa polaczone. I pojawia sie problem skad wziasc id dzialow ktore usunolem bo chce przy okazji usunac wszystkie tematy ktore do dzialu należa tongue.gif
wujek2009
W MySQLu jest coś tak genialnego jak więzy integralności - powinieneś tym się zainteresować. Już na etapie projektowania bazy nadajesz takie więzy i później właśnie podczas usuwania głównego forum - automatycznie usuwa Ci tematy.

PS. Jeśli nic nie znajdziesz pod hasłem "więzy integralności" to spróbuj pod hasłem "klucze obce mysql"

Jednak jeśli chodzi o Twój problem to proponuje coś w stylu:
(ps. fajnie jakbyś takie usuwanie oparł o transakcje w mysql - poczytaj o tym);
  1. $forum_id = $_GET['forum']; // id forum do usunięcia:
  2.  
  3. // sprawdź czy w ogóle takie forum istnieje o identyfikatorze $forum_id - zwykłe zapytanie SQL
  4.  
  5. $dzialyZapytanie = 'select dzial_id from forum_dzialy where forum_id = '. $forum_id;
  6. $pobierzWszystkieDzialy = mysql_query, itd dla zmiennej $dzialyZapytanie; // pobieramy wszystkie działy krótko mówiąc
  7. $dzialyTablica = array(); // przechowujemy ID działów
  8.  
  9. if ( $pobierzWszystkieDzialy )
  10. {
  11. foreach ( $pobierzWszystkieDzialy as $dzial_data )
  12. {
  13. $dzialyTablica[$dzial_data['dzial_id']] = $dzial_data['dzial_id'];
  14. }
  15.  
  16. if ( count($dzialyTablica) )
  17. {
  18. // usuwamy tematy z działów:
  19. mysql_query('delete from forum_tematy where temat_dzial_id IN ('. implode(',', $dzialyTablica) )');
  20. }
  21. }
  22.  
  23. // później to:
  24. - usuwamy powyższe działy
  25. - usuwamy forum
  26. - synchornizujemy liczniki (ilość postów, ostatni autor, itd - typowy schemat dla for dyskusyjnych)


PS. Kod pisany z palca, przepraszam za literówki w kodzie ;-)
PS2. Kod pisany luźnie - musisz go dostosować do swoich potrzeb. Nazwy kolumn, nazwy tabel, itd pisałem na domysł.
set4812
Do kluczów obcych zawsze musze dodawać tabele dodatkową?
Klucze obce sie sprawdzą przy schemacie takim ze usuwam 1 kategorie to usuwają się : dzialy, tematy ktore są w działach, i posty ktore sa w temacie.
Wychodza 3 dodatkowe tabele przy czyms takim.
Jakbym mial kontrolowac tranzakcje to nie za duzo zapytan bede robic do bazy aby pobierac dane i nie bedzie podobny schemat to co napisałeś?
viking
Klucze obce to integralna część tabel. Nie musisz nic więcej tworzyć, dajesz tylko ON DELETE CASCADE czy co tam chcesz.
wujek2009
Udostępniam Ci mój przykład związany z kluczami obcymi. Dwie tabele:

a) tabela użytkowników (identyfikator to kolumna "id")
cool.gif tabela sesji (sesji dla danego użytkownika = zwróć uwagę na kolumnę "user_id" - łączy się z tabela użytkowników dla kolumny "id")

Tabela użytkowników
  1. CREATE TABLE IF NOT EXISTS `users`
  2. (
  3. `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  4.  
  5. `name` varchar(25) NOT NULL,
  6. `surname` varchar(32) NOT NULL,
  7. `username` varchar(32) NOT NULL,
  8. `email` varchar(127) NOT NULL,
  9. `password` varchar(64) NOT NULL,
  10.  
  11. UNIQUE KEY `uniq_username` (`username`),
  12. UNIQUE KEY `uniq_email` (`email`)
  13. ) engine = innodb DEFAULT charset = utf8;


Tabela sesji
  1. CREATE TABLE IF NOT EXISTS `sessions`
  2. (
  3. `session_id` varchar(24) NOT NULL PRIMARY KEY,
  4. `last_active` int(10) UNSIGNED NOT NULL,
  5. `contents` text NOT NULL,
  6. `user_id` int(10) UNSIGNED NOT NULL DEFAULT 1,
  7. `user_ip` varchar(15) NOT NULL,
  8.  
  9. UNIQUE KEY `uniq_sid` (`session_id`, `user_id`),
  10. INDEX fk_active_index (`last_active`),
  11. INDEX fk_uid_index (`user_id`),
  12.  
  13. FOREIGN KEY (user_id) REFERENCES users (id) ON UPDATE cascade ON DELETE cascade
  14. ) engine = innodb DEFAULT charset = utf8;


Zapis:
Kod
foreign key (user_id) references users (id) on update cascade on delete cascade


można tłumaczyć: ~ kolumnę "user_id" (z tabeli sessions) połącz z tabelą "users" i odwołaj się do kolumny "id" (z tabeli "users") w przypadku:
a) aktualizacji rekordu ("on update"),
cool.gif usunięcia rekordu ("on delete")

I gdybyś zastosował takie rozwiązanie w swoim projekcie to ograniczyłbyś zapytania typu pobierz ID działów, usuń tematy z danego działu, itd.
set4812
Miałem klucze obce na zajecia z baz danych ale jakos nie przywiazalem do tego uwagi. Narazie tabele mam zrobiona z phpmyadmina i wypelniana byle czym wiec moge sobie modyfikowac dowolnie.
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.