Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][mysql]Usuwanie rekordów z wielu tabel
Forum PHP.pl > Forum > PHP
seba15290
Witam,
mam taki problem, nie wiem jak napisać zapytanie które usuwa wszystkie rekordy w bazie danych w których id_people należy d konkretnej osoby.
Oto struktura mojej bazy danych.
  1. CREATE TABLE `adresy` (
  2. `id_people` int(11) NOT NULL,
  3. `nazwa_instytucji` varchar(255) NOT NULL,
  4. `nazwa_wydzialu` varchar(255) NOT NULL,
  5. `www_instytucji` varchar(255) NOT NULL,
  6. `www_wydzialu` varchar(255) NOT NULL,
  7. `adres` varchar(255) NOT NULL,
  8. `kod_pocztowy` varchar(20) NOT NULL,
  9. `miejscowosc` varchar(30) NOT NULL,
  10. `stan` varchar(255) NOT NULL,
  11. `telefon` varchar(50) NOT NULL,
  12. `fax` varchar(20) NOT NULL,
  13. `id_kraj` int(11) NOT NULL
  14. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  15.  
  16. CREATE TABLE `dziedzina_naukowa` (
  17. `id_dziedziny` int(5) UNSIGNED NOT NULL AUTO_INCREMENT,
  18. `dziedzina` varchar(50) NOT NULL,
  19. PRIMARY KEY (`id_dziedziny`)
  20. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=4 ;
  21.  
  22. CREATE TABLE `granty` (
  23. `id_granta` mediumint(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  24. `nazwa` varchar(255) NOT NULL,
  25. `miejsce` varchar(255) NOT NULL,
  26. `kiedy` year(4) NOT NULL,
  27. PRIMARY KEY (`id_granta`)
  28. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=3 ;
  29.  
  30. CREATE TABLE `konferencje` (
  31. `id_konferencji` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  32. `id_people` int(10) NOT NULL,
  33. `temat` varchar(255) NOT NULL,
  34. `miasto` varchar(255) NOT NULL,
  35. `id_kraj` int(10) NOT NULL,
  36. `data_rozpoczecia` date NOT NULL DEFAULT '0000-00-00',
  37. `data_zakonczenia` date NOT NULL DEFAULT '0000-00-00',
  38. `www_konferencji` varchar(255) NOT NULL,
  39. PRIMARY KEY (`id_konferencji`)
  40. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=25 ;
  41.  
  42. CREATE TABLE `kraj` (
  43. `id_kraj` mediumint(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  44. `kraj` varchar(30) NOT NULL,
  45. PRIMARY KEY (`id_kraj`)
  46. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=27 ;
  47.  
  48. CREATE TABLE `people` (
  49. `id_people` mediumint(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  50. `id_users` mediumint(10) DEFAULT NULL,
  51. `imie` varchar(30) NOT NULL,
  52. `nazwisko` varchar(40) NOT NULL,
  53. `tytuly_naukowe` varchar(255) NOT NULL,
  54. `email` varchar(30) NOT NULL,
  55. `www` varchar(255) NOT NULL,
  56. `data_ur` year(4) NOT NULL,
  57. `data_zm` year(4) NOT NULL,
  58. `opis` text NOT NULL,
  59. `id_zdjecia` int(11) NOT NULL,
  60. `data_dodania` datetime NOT NULL,
  61. `data_aktualizacji` datetime NOT NULL,
  62. `widoczny` enum('N','Y') NOT NULL,
  63. PRIMARY KEY (`id_people`)
  64. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=51 ;
  65.  
  66. CREATE TABLE `people_grant` (
  67. `id_people` int(5) NOT NULL,
  68. `id_granta` int(5) NOT NULL
  69. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  70.  
  71. CREATE TABLE `przynaleznosc` (
  72. `id_people` int(5) NOT NULL,
  73. `id_towarzystwa` int(5) NOT NULL,
  74. `data` year(4) NOT NULL,
  75. `funkcja` varchar(255) NOT NULL
  76. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  77.  
  78. CREATE TABLE `stopien_people` (
  79. `id_stopnia` int(5) NOT NULL,
  80. `id_people` int(5) NOT NULL,
  81. `id_dziedziny` int(5) NOT NULL,
  82. `miejsce` varchar(255) NOT NULL,
  83. `data_otrzymania` year(4) NOT NULL
  84. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  85.  
  86. CREATE TABLE `stopnie_naukowe` (
  87. `id_stopnia` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  88. `stopien_naukowy` varchar(255) NOT NULL,
  89. PRIMARY KEY (`id_stopnia`)
  90. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=50 ;
  91.  
  92. CREATE TABLE `towarzystwa` (
  93. `id_towarzystwa` mediumint(5) UNSIGNED NOT NULL AUTO_INCREMENT,
  94. `nazwa` varchar(255) NOT NULL,
  95. `miejsce` varchar(255) NOT NULL,
  96. `www_towarzystwa` varchar(100) NOT NULL,
  97. PRIMARY KEY (`id_towarzystwa`)
  98. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=7 ;
  99.  
  100. CREATE TABLE `users` (
  101. `id_users` smallint(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  102. `imie` varchar(255) NOT NULL,
  103. `nazwisko` varchar(255) NOT NULL,
  104. `email` varchar(255) NOT NULL,
  105. `login` varchar(255) NOT NULL,
  106. `haslo` varchar(255) NOT NULL,
  107. `data_dodania` date NOT NULL,
  108. `data_modyfikacji` datetime NOT NULL,
  109. `data_logowania` datetime NOT NULL,
  110. `typ` enum('user','admin') NOT NULL,
  111. PRIMARY KEY (`id_users`)
  112. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=10 ;
  113.  
  114. CREATE TABLE `zaint_people` (
  115. `id_people` int(5) NOT NULL,
  116. `id_zainteresowania` int(5) NOT NULL
  117. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  118.  
  119. CREATE TABLE `zainteresowania` (
  120. `id_zainteresowania` int(5) UNSIGNED NOT NULL AUTO_INCREMENT,
  121. `zainteresowanie` varchar(255) NOT NULL,
  122. PRIMARY KEY (`id_zainteresowania`)
  123. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=9 ;
  124.  
  125. CREATE TABLE `zdjecie` (
  126. `id_zdjecia` int(11) NOT NULL AUTO_INCREMENT,
  127. `nazwa_pliku` varchar(255) NOT NULL,
  128. `typmime` varchar(50) NOT NULL,
  129. `dane_pliku` mediumblob,
  130. PRIMARY KEY (`id_zdjecia`)
  131. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=49 ;

Próbuje napisać zapytanie ale nie bardzo wiem jak :
  1. <?php
  2. $zapytanie="delete from people as p, adresy as a , zdjecie as z, przynaleznosc as pr, s
    topien_people as sp, zaint_people as zp, people_grant as pg using p, adresy as a 
    , zdjecie as z, przynaleznosc as pr, stopien_people as sp, zaint_people as zp, pe
    ople_grant as pg where p.id_people=a.id_people and p.id_zdjecia=z.id_zdjecia and 
    p.id_people='$id_people';"
    ;
  3. ?>
SirZooro
Sądząc po strukturze bazy danych to jest jakiś poważniejszy projekt, więc zamiast usuwania osoby i powiązanych z nią rekordów proponowałbym zamiast tego oznaczyć ją jako nieaktywną. Aby to zrobić, powinieneś dodać nowe pole do tabeli people, i odpowiednio zmodyfikować zapytania aby dodatkowo uwzględniały wartość tego nowego pola. Być może także potrzeba będzie dodać podobne pole do innych tabel - tutaj musisz się zastanowić.

Jeżeli jednak chcesz nadal usuwać te rekordy, to najprościej chyba będzie napisać kilka zapytań, z których każde będzie usuwać dane z jednej tabeli.

Możesz też poczytać o więzach kluczy obcych dla których ustawione jest ON DELETE CASCADE: FOREIGN KEY Constraints
seba15290
Cytat(SirZooro @ 4.02.2008, 18:19:14 ) *
Sądząc po strukturze bazy danych to jest jakiś poważniejszy projekt, więc zamiast usuwania osoby i powiązanych z nią rekordów proponowałbym zamiast tego oznaczyć ją jako nieaktywną. Aby to zrobić, powinieneś dodać nowe pole do tabeli people, i odpowiednio zmodyfikować zapytania aby dodatkowo uwzględniały wartość tego nowego pola. Być może także potrzeba będzie dodać podobne pole do innych tabel - tutaj musisz się zastanowić.

Jeżeli jednak chcesz nadal usuwać te rekordy, to najprościej chyba będzie napisać kilka zapytań, z których każde będzie usuwać dane z jednej tabeli.

Możesz też poczytać o więzach kluczy obcych dla których ustawione jest ON DELETE CASCADE: FOREIGN KEY Constraints

Jeśli chodzi o takie pole to już jest, nazywa sie widoczny w tabeli people i chyba przy tym zostanę.
em1X
Jak najbardziej powinieneś się przesiąść z MyISAM na InnoDB. Ustawiając jak kolega wspomniał na tabeli `people` opcję ON DELETE CASCADE, baza usunie wszystkie rekordy z powiązanych tabel, powiązane z usuniętym rekordem guitar.gif . Jednak będziesz jeszcze musiał wszystkie tabele ze sobą powiązać. Sama zmiana na InnoDB nie wystarczy.
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.