Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][mysql] Wstawianie danych jednoczesnie w 4 tabele - można ?
Forum PHP.pl > Forum > PHP
Mayka
Witam

Mam taki mały problem i nie bardzo wiem jak to rozwiązać, czy jest jakoś możliwośc żeby wstawić dane jednoczesnie do 4 tabel ? a nie 4 zapytaniami ?
Bo odczytywanie w jednym zapytaniu bez wiekszego problemu, a co z zapisem do tabeli ? Można wogole ?
Uriziel01
Na pewno możesz przy pomocy transakcji:
http://www.databasejournal.com/features/my...ns-in-MySQL.htm
A czy w jakiś inny sposób, niestety nie wiem.

EDIT:
W specyficznych przypadkachPo przemyśleniu jeszcze w ten sposób:
Kod
INSERT INTO table1(c1, c2, c3), table2(c4, c5, c6) VALUES ('v1', 'v2','v3',v4, 'v5', 'v6');
mortus
Cytat(Uriziel01 @ 9.01.2012, 12:42:05 ) *
Na pewno możesz przy pomocy transakcji:
http://www.databasejournal.com/features/my...ns-in-MySQL.htm
A czy w jakiś inny sposób, niestety nie wiem.

EDIT:
W specyficznych przypadkachPo przemyśleniu jeszcze w ten sposób:
Kod
INSERT INTO table1(c1, c2, c3), table2(c4, c5, c6) VALUES ('v1', 'v2','v3',v4, 'v5', 'v6');

W jakich to specyficznych przypadkach? Próbowałeś chociaż?

Albo transakcje, albo procedura.
Uriziel01
Cytat(mortus @ 9.01.2012, 13:02:27 ) *
W jakich to specyficznych przypadkach? Próbowałeś chociaż?

Albo transakcje, albo procedura.


1)Oczy mnie mylą czy ten kawałek akapitu jest przekreślony, no cóż może to tylko mój monitor.
2)Oczywiście że nie próbowałem, oparłem się na doświadczeniach innych po znalezieniu kilku jednakowych wyników w 'popularnej wyszukiwarce', przepraszam że ośmieliłem się stwierdzić że skoro działa to dla kilku innych osób zadziała i dla pana @Mayka. mea culpa.
mortus
Cytat(Uriziel01 @ 9.01.2012, 13:11:53 ) *
1)Oczy mnie mylą czy ten kawałek akapitu jest przekreślony, no cóż może to tylko mój monitor.
2)Oczywiście że nie próbowałem, oparłem się na doświadczeniach innych po znalezieniu kilku jednakowych wyników w 'popularnej wyszukiwarce', przepraszam że ośmieliłem się stwierdzić że skoro działa to dla kilku innych osób zadziała i dla pana @Mayka. mea culpa.


1. Przekreśliłeś w trakcie gdy pisałem posta.
2. To, że ktoś pyta, czy tak można, nie oznacza, że tak można. W większości tych samych wyników z tej samej wyszukiwarki to była tylko niewielka część tematu, który w konsekwencji zawsze kończył się podsumowaniem, że tak się nie da.

Nie chodzi o to, że chcę się czegoś uczepić. Ale skoro już pofatygowałeś się, żeby poszukać, to trzeba było przynajmniej przewinąć strony do końca albo choćby do połowy. Tymczasem wprowadzasz użytkownika @Mayka w błąd.
Mayka
Ja tez kozystalem z 'popularnej wyszukiwarki' ale nie znalazlem nic co by mnie usatysfakcjonowalo wiec pytam was jako bardziej doswiadczonych programistow wink.gif
Czyli sie nie da ?
nospor
Nie można jednym zapytaniem włożyć danych do kilku tabel.

Może napisz po co ci to dokładnie i czemu aż tak bardzo cię bolą te 4 zapytania?
Mayka
Chodzi mi o to że w 4 tabelach przechowuje dane które łączą sie przez id, i teraz dodajemy: pierwsze zapytanie jest ok, drugie ok, a na 3 cos sie wywaliło i teraz robi sie bałagan.. Bo pierwsze 2 są a 3 i 4 niema. I dlatego pytam czy to można jakoś zrobić za jednym zamachem.
bartez119
To jak jest błąd w 3 zapytaniu to wypadało by je sprawdzić czy jest poprawne? Po za tym 4 zapytania to jeszcze nie jest dużo.
Mayka
A jak sprawdzic czy dany insert wykona sie poprawnie nie wykonujac go ?
mortus
Kolega @Uriziel01 podał przecież odnośnik do strony, na której znajduje się rozwiązanie problemu. Jeśli tabele działają na silniku InnoDB to użyj transakcji:
  1. START TRANSACTION;
  2. -- INSERT 1
  3. -- INSERT 2
  4. -- INSERT 3
  5. -- INSERT 4
  6. COMMIT;

Wtedy dane zostaną zapisane albo we wszystkich tabelach, albo w żadnej. Jeśli korzystasz z silnika, który domyślnie transakcji nie obsługuje, to poszukaj odpowiedniego rozwiązania w Google używając słowa "transaction". Można znaleźć nawet gotowe i darmowe rozwiązania, choćby dla silnika MyISAM. Oczywiście pomiędzy kolejnymi INSERT-ami możesz sobie dane dowolnie obrabiać po stronie PHP.

UWAGA: Korzystanie z transakcji po stronie PHP może wyglądać różnie. Jeśli dobrze pamiętam, to PDO posiada zaimplementowane wsparcie dla transakcji i najlepiej z tego wsparcia/rozwiązania skorzystać.
Niktoś
Cytat
Nie można jednym zapytaniem włożyć danych do kilku tabel.

Może napisz po co ci to dokładnie i czemu aż tak bardzo cię bolą te 4 zapytania?


Za pomocą PDO i procedury składowej na pewno by się dało.
nospor
Tja.... tylko, że ta Twoja jedna procedura i tak będzie zawierała w sobie 4 zapytania będące insertami. Jak się trzecie wywali to i tak dwa pozostałe zostaną wykonane. Też mi niesamowite rozwiązanie problemu :/
Odpowiedź już padła: transakcje.
Niktoś
Cytat
Tja.... tylko, że ta Twoja jedna procedura i tak będzie zawierała w sobie 4 zapytania będące insertami.

Owszem,w procedurze będą,ale w kodzie php robisz tylko jedno zapytanie.

Cytat
Jak się trzecie wywali to i tak dwa pozostałe zostaną wykonane.

A niby jak,dlatego poleciłem PDO,aby użyć parametrów w procedurze.

Do tych czterech insertów używamy tych samych parametrów-nie ma opcji ,żeby jakieś zapytanie się nie wykonało.
Albo wszystkie zapytania się wykonają albo ,żadne ,gdyż w każdym zapytaniu ,będą wykorzystywane te same parametry.
Cytat
Też mi niesamowite rozwiązanie problemu :/

Zawsze jakieś.
nospor
1) Nie przeczytałeś rozwinięcia problemu przez autora. To że w php bedzie miał jedno zapytanie a nie 4 nie rozwiązuje w zaden sposób problemu
2) Nie przeczytałeś innych postów bo procedura już padła w innym poście.
3)
Cytat
A niby jak,dlatego poleciłem PDO,aby użyć parametrów w procedurze.
A co ma piernik do wiatraka? Zapytanie może się wywalić od tak sobie, niezależnie czy masz parametry czy ich nie masz.

Odpowiedzią są transkacje.

4)
Cytat
Zawsze jakieś.

Pytajacy: hej, mam problem, nie mogę otworzyć okna w samochodzie
Odpowiadający: Kup sobie nowy samochód
Moderator: Durne rozwiazanie
Odpowiadajacy: zawsze jakies
....
tongue.gif
Niktoś
Cytat
Zapytanie może się wywalić od tak sobie, niezależnie czy masz parametry czy ich nie masz.


Od tak sobie to się może wywalić cała aplikacja pisana w php i serwer apache -to nie jest argument.

Gdybym nie robił tego u siebie,to bym Tobie przyznał rację.Jednak wiem jakby to działało.I wiem ,że jest możliwe za pomocą procedury przypisać te same dane do 4 innych tabel o tej samej strukturze.

Może tranzakcje są lepszym rozwiązaniem,ale proszę Cię nie pisz ,że za pomocą procedury się nie da ,albo zapytanie może się wywalić od tak sobie.Za pomocą procedur robię bardziej skomplikowane rzeczy,które raczej w języku PHP i MySQL długo jeszcze nie będą dostępne.
mortus
Cytat(Niktoś @ 10.01.2012, 14:52:29 ) *
Do tych czterech insertów używamy tych samych parametrów-nie ma opcji ,żeby jakieś zapytanie się nie wykonało.
Albo wszystkie zapytania się wykonają albo ,żadne ,gdyż w każdym zapytaniu ,będą wykorzystywane te same parametry.

A jaki jest sens dodawania takich samych danych do czterech różnych tabel? No chyba, że ja nie umiem czytać, albo nie potrafię tego tekstu zrozumieć. Autorce/owi nie chodzi o takie same dane!

W procedurze wyglądałoby to tak, że np. pierwsze pięć parametrów trafia do tabeli pierwszej, drugie pięć parametrów trafia do tabeli drugiej, kolejne trzy trafiają do tabeli trzeciej i ostanie dwa trafiają do tabeli czwartej. Dodatkowo do tabeli drugiej, trzeciej i czwartej trafia identyfikator rekordu wstawionego do tabeli pierwszej. W związku z tym powyższe/cytowane zdania mijają się z prawdą. Każde z tych zapytań, służących do wstawiania danych może się wywalić, a autorowi/ce tematu zależy na tym, aby w przypadku "wywalenia" się któregoś z zapytań, żadne dane nie zostały do bazy dodane. Wniosek jest taki, że procedura musi korzystać z transakcji.

Jednoznaczna odpowiedź na pytanie: transakcje.
nospor
@Niktoś przeczytaj post mortusa
Niktoś
No faktycznie ,w tym przypadku rozwiązanie lepsze ,powiem jedynie że w MSSQL i T-SQL da rady byłoby to zrobić samą procedurą:
Aby mieć pewność czy wszystkie zapytania w procedurze wykonają się poprawnie dajemy:
  1. BEGIN TRY
  2. { sql_statement | statement_block }
  3. END TRY
  4. BEGIN CATCH
  5. [ { sql_statement | statement_block } ]
  6. END CATCH
  7. [ ; ]

W MYSQL nie ma bloków try,catch.
mortus
Każdy system bazodanowy ma swoje wady i zalety. W jednym pewne rzeczy zrobisz szybciej, w drugim trzeba się nagimnastykować. Alternatywą dla T-SQL-owego bloku TRY ... CATCH ... mogą być uchwyty warunków (tłumaczenie dosłowne, więc nie wiem, czy do końca prawidłowe), choć służą one raczej do obsługi błędów od strony administracyjnej.

Jednak w temacie nie chodzi o porównywanie jednego i drugiego systemu bazodanowego, a o to, jak rozwiązać pewien problem w MySQL. Rozwiązaniem są transakcje.

EDIT: De facto w większości przykładów z jakimi się spotkałem wewnątrz bloku TRY wykorzystuje się transakcje przy wykonywaniu większej ilości zapytań, więc nie jestem wcale przekonany, czy użycie samego bloku TRY ... CATCH ... zda egzamin i czy dane nie zostaną jednak do którejś z tabel wstawione. Jak będę miał okazję, to sprawdzę.

Po dłuższym namyślę dochodzę do wniosku, że sam blok TRY ... CATCH ... nie wystarczy, a jako że nie można ich zagnieżdżać rozwiązanie to nie zda egzaminu i też trzeba będzie użyć transakcji.
Mayka
Autorowi wink.gif
Oczywiście że nie chodzi o wprowadzanie tych samych danych do bazy, ale teraz mam pytanie co w wypadku gdy nie jest to InnoDB tylko MyISAM ? Bo aż tak nigdy się nie zagłębiałem w struktóre mysql'a

A jeszcze jedno, jak skonstruować takie zapytanie ? Bo w linku który podał mi Uriziel jest tylko opis od strony mysql'a a jak to zapakować w php ?
znalazłem takie coś:
  1. $query = "start transaction;";
  2. $query .= "update tabela set cos = 100 where id = 1;";
  3. $query .= "update tabela2 set cos = ".$zmienna." where id = 2;";
  4. $query .= "ROLLBACK;";
  5. mysql_query($query);

Uriziel01
Co dokładnie masz na myśli ? Przecież to jest właśnie przykład jak skonstruować takie zapytanie smile.gif

Co do MyISAM, można przykładowo tak http://adodb.sourceforge.net/
nospor
@Uriziel01 oraz @Mayka
w mysql_ można wykonywać tylko 1 zapytanie na raz.
$query = "start transaction;";
$query .= "update tabela set cos = 100 where id = 1;";
$query .= "update tabela2 set cos = ".$zmienna." where id = 2;";
$query .= "ROLLBACK;";
To coś zawiera 4 zapyttania. Nie można tego wykonać w jednym mysql_query. Każde zapytanie trzeba wykonać w osobnym mysql_query
Uriziel01
Hmmm, no masz racje @nospor, ale gdzie ja powiedziałem że można zrobić 4 zapytania w jednym query ?
  1. mysql_query("START TRANSACTION");
  2. $a1 = mysql_query("INSERT INTO testowa_tablice1 (id) VALUES('1')");
  3. $a2 = mysql_query("INSERT INTO testowa_tablica_222 (id) VALUES('2')");
  4. mysql_query("COMMIT");
nospor
O tu
Cytat
Przecież to jest właśnie przykład jak skonstruować takie zapytanie

Widziałeś przecież wyraźnie, że on to wszystko wkłada w jedno mysql_query.
Uriziel01
Wrrrr, prawda. Miałem na myśli linkę która ci dałem. Przepraszam oczywiście jeżeli wprowadziłem w błąd tym, co innego miałem na myśli a kompletnie inaczej to wybrzmiało.
Mayka
Cytat(Uriziel01 @ 11.01.2012, 08:23:46 ) *
Hmmm, no masz racje @nospor, ale gdzie ja powiedziałem że można zrobić 4 zapytania w jednym query ?
  1. mysql_query("START TRANSACTION");
  2. $a1 = mysql_query("INSERT INTO testowa_tablice1 (id) VALUES('1')");
  3. $a2 = mysql_query("INSERT INTO testowa_tablica_222 (id) VALUES('2')");
  4. mysql_query("COMMIT");


No dobra to teraz mi powiedzcie co sie stanie jak $a2 sie nie wykona ? I co ja mam sprawdzać czy sie wkonało ? $a1 ? $a2 ?
nospor
mysql_query zwraca FALSE, gdy zapytanie się nie wykona.
Jeśli więc zapytanie zwróci FALSE to masz zrobic ROLLBACK a nie robić COMMIT.
vee
jeżeli Ci zależy, żeby wiedzieć które zapytanie się nie powiodło, sprawdzasz oddzielnie każdą ze zmiennych (tj. a1, a2 itd)

Jeśli nie ma takiej potrzeby możesz zrobić coś w stylu

$result = true;
$result = $result AND mysql_query(...);
$result = $result AND mysql_query(...);
$result = $result AND mysql_query(...);

jeśli któreś zapytanie się nie powiedzie wtedy result = false, jeśli wszystkie się powiodą wtedy result = true. Dzięki temu możesz dodawać/odejmować zapytania, bez konieczności dopisywania czy modyfikowania reszty kodu.
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.