![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 304 Pomógł: 1 Dołączył: 12.01.2009 Skąd: Kanapa Ostrzeżenie: (0%) ![]() ![]() |
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 ? |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 307 Pomógł: 37 Dołączył: 9.11.2010 Skąd: Zielona Góra Ostrzeżenie: (0%) ![]() ![]() |
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: Kod INSERT INTO table1(c1, c2, c3), table2(c4, c5, c6) VALUES ('v1', 'v2','v3',v4, 'v5', 'v6');
Ten post edytował Uriziel01 9.01.2012, 12:56:17 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
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: 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. |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 307 Pomógł: 37 Dołączył: 9.11.2010 Skąd: Zielona Góra Ostrzeżenie: (0%) ![]() ![]() |
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. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
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. Ten post edytował mortus 9.01.2012, 13:18:20 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 304 Pomógł: 1 Dołączył: 12.01.2009 Skąd: Kanapa Ostrzeżenie: (0%) ![]() ![]() |
Ja tez kozystalem z 'popularnej wyszukiwarki' ale nie znalazlem nic co by mnie usatysfakcjonowalo wiec pytam was jako bardziej doswiadczonych programistow (IMG:style_emoticons/default/wink.gif)
Czyli sie nie da ? |
|
|
![]()
Post
#7
|
|
Grupa: Moderatorzy Postów: 36 559 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
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? |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 304 Pomógł: 1 Dołączył: 12.01.2009 Skąd: Kanapa Ostrzeżenie: (0%) ![]() ![]() |
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.
Ten post edytował Mayka 9.01.2012, 17:59:36 |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 1 Pomógł: 0 Dołączył: 15.04.2011 Skąd: Głogów Ostrzeżenie: (0%) ![]() ![]() |
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.
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 304 Pomógł: 1 Dołączył: 12.01.2009 Skąd: Kanapa Ostrzeżenie: (0%) ![]() ![]() |
A jak sprawdzic czy dany insert wykona sie poprawnie nie wykonujac go ?
|
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
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:
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ć. |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 1 195 Pomógł: 109 Dołączył: 3.11.2011 Ostrzeżenie: (10%) ![]() ![]() |
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. Ten post edytował Niktoś 10.01.2012, 02:10:25 |
|
|
![]()
Post
#13
|
|
Grupa: Moderatorzy Postów: 36 559 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
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. |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 1 195 Pomógł: 109 Dołączył: 3.11.2011 Ostrzeżenie: (10%) ![]() ![]() |
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ś. |
|
|
![]()
Post
#15
|
|
Grupa: Moderatorzy Postów: 36 559 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
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 .... (IMG:style_emoticons/default/tongue.gif) |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 1 195 Pomógł: 109 Dołączył: 3.11.2011 Ostrzeżenie: (10%) ![]() ![]() |
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. Ten post edytował Niktoś 10.01.2012, 15:23:10 |
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
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. Ten post edytował mortus 10.01.2012, 15:24:45 |
|
|
![]()
Post
#18
|
|
Grupa: Moderatorzy Postów: 36 559 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
@Niktoś przeczytaj post mortusa
|
|
|
![]()
Post
#19
|
|
Grupa: Zarejestrowani Postów: 1 195 Pomógł: 109 Dołączył: 3.11.2011 Ostrzeżenie: (10%) ![]() ![]() |
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:
W MYSQL nie ma bloków try,catch. Ten post edytował Niktoś 10.01.2012, 15:53:55 |
|
|
![]()
Post
#20
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
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. Ten post edytował mortus 10.01.2012, 16:54:59 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 26.09.2025 - 02:38 |