Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: dodawanie rekordu do kilku tabel jednocześnie
Forum PHP.pl > Forum > Bazy danych > MySQL
Jozjasz
Witam

Jeśli posiadam następującą bazę danych

O nazwie: ‘super’, w której gromadzę superbohaterów i odpowiadających im aktorów.

Actors(actor_id, actor_name, actor_surname)
Hero(id, actor_id, name, place, weapon, skills) - 'actor_id' jest kluczem obcym

To żeby połączyć te dwie tabele to wpiszę np.: select * from actors INNER JOIN hero using(actor_id);

Z ‘select’ jest sprawa jasna, a co jeśli chcę dodać nowy record do dwóch tabel jednocześnie? – żeby klucz actor_id pojawił się jednocześnie w obu tabelach dla zachowania spójności. Czy może się nie da i trzeba oddzielnie napisać dwa zapytania?
nospor
Dwa zapytania.
Jozjasz
OK, dzięki, udało mi się stworzyć coś takiego, co działa:

  1. <?php
  2.  
  3. //napisano przeze mnie...
  4.  
  5. $name = 'Patric';
  6. $sur = 'Steward';
  7.  
  8. $con = mysqli_connect('localhost','Jacob','Dankan34r','super');
  9.  
  10. $q = "insert into actors values(NULL, '$name', '$sur')";
  11.  
  12. $r = mysqli_query($con, $q) or die(mysqli_error($con));
  13.  
  14. $actor_id = mysqli_insert_id($con);
  15.  
  16.  
  17. if($r){
  18.  
  19. $q = "insert into heros values(NULL, '$actor_id', 'Profesor Xavier', 'USA', NULL, 'reading thoughts')";
  20.  
  21. $r2 = mysqli_query($con, $q) or die(mysqli_error($con));
  22.  
  23. }
  24.  
  25. if($r and $r2){
  26.  
  27. echo 'Dodano nowy rekord do bazy o id: '.$actor_id;}
  28.  
  29. ?>


Ale teraz patrzę po necie nie mogę znaleźć jak usunąć za pomoca DELETE z dwóch tabel, lub więcej, rekord powiązany ze sobąquestionmark.gif Czy mógłby mi ktoś pomóc z tym?
luckyps
Poszukaj o usuwaniu kaskadowym.
Jozjasz
To kaskadowe chyba działa tyko w InnoDB, a ja mam MyISAM i nie chcę tego zmienić. Nie ma jakiejś prostszej metody? Np. jeśli chciałbym usunąć 'actors.actor_id=13', który jest w dwóch tabelach...
nospor
No to zrób dwa delete. Masz dwa insert to czemu nie możesz zrobic dwa delete?

Pozatym w manualu przy delete masz podaną składnią jak w jednym zapytaniu usunąć z dwóch tabel
http://dev.mysql.com/doc/refman/5.0/en/delete.html
Jozjasz
No właśnie nie chce mi działać ... niby jest błąd, np piszę tak:
  1. DELETE FROM actors.actor_id, heros.actor_id FROM actors, heros WHERE actors.actor_id=13 AND heros.actor_id=13;
nospor
W linku co ci podałem, nigdzie nie widzę, by pomiędzy SELECT....FROM podawano nazwy kolumn. Dokumentacja jest oparta dobrymi przykładami. Trzeba się naprawdę mocno starać, by napisać to źle.
Wcześniej widziałem wersję jak mialeś dwa FROM.
Skup się trochę.
Adi32
Dlaczego zleży Ci na tym aby pozostać na MyISAM?
Do tego typu zapytań, gdzie jedna czynność powoduje więcej niż jedną relację z bazą danych i nie są to selekty to zaleca się użycie transakcji, oczywiście w zależności do czego ma służyć ta baza... - MyISAM nie obsługuje transakcji.
Poza tym 'actor_id' nie jest kluczem obcym tylko pseudo kluczem obcym gdyż MyISAM nie obsługuje relacji tabel...
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.