Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [php][mysql] Wstawianie danych jednoczesnie w 4 tabele - można ?
Mayka
post
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 ?
Go to the top of the page
+Quote Post
Uriziel01
post
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:
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');


Ten post edytował Uriziel01 9.01.2012, 12:56:17
Go to the top of the page
+Quote Post
mortus
post
Post #3





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Uriziel01
post
Post #4





Grupa: Zarejestrowani
Postów: 307
Pomógł: 37
Dołączył: 9.11.2010
Skąd: Zielona Góra

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
mortus
post
Post #5





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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.

Ten post edytował mortus 9.01.2012, 13:18:20
Go to the top of the page
+Quote Post
Mayka
post
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 ?
Go to the top of the page
+Quote Post
nospor
post
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?
Go to the top of the page
+Quote Post
Mayka
post
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
Go to the top of the page
+Quote Post
bartez119
post
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.
Go to the top of the page
+Quote Post
Mayka
post
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 ?
Go to the top of the page
+Quote Post
mortus
post
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:
  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ć.
Go to the top of the page
+Quote Post
Niktoś
post
Post #12





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


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
Go to the top of the page
+Quote Post
nospor
post
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.
Go to the top of the page
+Quote Post
Niktoś
post
Post #14





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


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ś.
Go to the top of the page
+Quote Post
nospor
post
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)
Go to the top of the page
+Quote Post
Niktoś
post
Post #16





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


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
Go to the top of the page
+Quote Post
mortus
post
Post #17





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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.

Ten post edytował mortus 10.01.2012, 15:24:45
Go to the top of the page
+Quote Post
nospor
post
Post #18





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




@Niktoś przeczytaj post mortusa
Go to the top of the page
+Quote Post
Niktoś
post
Post #19





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


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.

Ten post edytował Niktoś 10.01.2012, 15:53:55
Go to the top of the page
+Quote Post
mortus
post
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
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 26.09.2025 - 02:38