MySQL / 2 pytania
Programmer - 27-12-2005 10:18
MySQL / 2 pytania
Hej
1. Mam dwie tabele typu innodb w ktorej sa powiazania kluczami obcymi (on delete = cascade). Czyli kiedy usuwam rekord z nadrzednej to usuwa sie tez automatycznie rekord w podrzednej. Robie to jednym zapytaniem (delete w nadrzednej). Czy takie jedno zapytanie powinno byc poprzedzone rozpoczeciem transakcji i zakonczone zatwierdzeniem lub w przypadku jakiegos bledu rollbackiem, czy tez wystarczy ze dam samego delete'a a w przypadku jakiegos bledu (np. przy kasowaniu rekordow z tabeli podrzednej) poprzednie operacje sie cofna.
2. To pytanie zadawalem juz jakis czas temu ale nie dostalem konkretnej odpowiedzi (lub tez nie specjalnie ja zrozumialem :)). Mam tabele z jakimis artykulami w ktorej znajduje sie pole odpowiedzialne za kolejnosc. Dodaje kolejny artykul i zwieksza sie kolejnosc (SELECT MAX(priority) + 1). Po zwiekszeniu sie kolejnosci robi sie insert artykulu. Problem w tym ze przy zapisie inny watek moze uzyskac ta sama kolejnosc i zapisac w bazie inny artykul z ta sama kolejnoscia. Dlatego chce na czas zapisu arytkulu zablokowac tabele LOCK'iem. Czy to dobry pomysl i czy taki lock powinien tez isc w transakcji?
pozdr p.
P.S. Moze macie jakies dobre materialy elektroniczne w ktorych moglbym poczytac sobie o tego typu problemach?
Krzysztof Wiśniewski - 29-12-2005 14:33
Użytkownik "Programmer" <programmer@nospam.org> napisał w wiadomości news:ae24e$43ae58e4$540a9c82$4729@news.chello.pl.. . | Hej | | 1. Mam dwie tabele typu innodb w ktorej sa powiazania kluczami obcymi (on | delete = cascade). Czyli kiedy usuwam rekord z nadrzednej to usuwa sie tez | automatycznie rekord w podrzednej. Robie to jednym zapytaniem (delete w | nadrzednej). Czy takie jedno zapytanie powinno byc poprzedzone rozpoczeciem | transakcji i zakonczone zatwierdzeniem lub w przypadku jakiegos bledu | rollbackiem, czy tez wystarczy ze dam samego delete'a a w przypadku jakiegos | bledu (np. przy kasowaniu rekordow z tabeli podrzednej) poprzednie operacje | sie cofna.
Taka operacja jest wykonywana łącznie, nie jest potrzebna żadna dodatkowa jawna deklaracja transakcji. Jeśli w tabeli podrzędnej nie ma żadnego rekordu odpowiadającego wartości klucza, to po prostu nie wykona się w niej żaden DELETE.
| 2. To pytanie zadawalem juz jakis czas temu ale nie dostalem konkretnej | odpowiedzi (lub tez nie specjalnie ja zrozumialem :)). Mam tabele z jakimis | artykulami w ktorej znajduje sie pole odpowiedzialne za kolejnosc. Dodaje | kolejny artykul i zwieksza sie kolejnosc (SELECT MAX(priority) + 1). Po | zwiekszeniu sie kolejnosci robi sie insert artykulu. Problem w tym ze przy | zapisie inny watek moze uzyskac ta sama kolejnosc i zapisac w bazie inny | artykul z ta sama kolejnoscia. Dlatego chce na czas zapisu arytkulu | zablokowac tabele LOCK'iem. Czy to dobry pomysl i czy taki lock powinien tez | isc w transakcji?
A może wystarczy pojedyncze zapytanie z podselektem?
INSERT INTO tabela SELECT (MAX(priority)+1) AS Lp, 'cośtam' FROM tabela
| pozdr | p. | | P.S. Moze macie jakies dobre materialy elektroniczne w ktorych moglbym | poczytac sobie o tego typu problemach?
Niestety dokumentacja na stronach mysql wydaje się najbardziej kompletnym i kompetentnym źródłem w tej sprawie.
Pozdrawiam, Krzysiek
Programmer - 29-12-2005 14:57
> A może wystarczy pojedyncze zapytanie z podselektem? > > INSERT INTO tabela > SELECT (MAX(priority)+1) AS Lp, 'cośtam' > FROM tabela
A co w przypadki kiedy bede zmienial kolejnosc ... Bede chcial zamienic kolejnosc w dwoch rekordach "obok siebie"
pzdr, p.
P.S. Dzieki za odp. na pyt. 1. Juz tracilem nadzieje :)
Krzysztof Wiśniewski - 29-12-2005 14:58
Użytkownik "Programmer" <programmer@nospam.org> napisał w wiadomości news:51bc2$43b1b1f3$540a9c82$20419@news.chello.pl. .. |> A może wystarczy pojedyncze zapytanie z podselektem? | > | > INSERT INTO tabela | > SELECT (MAX(priority)+1) AS Lp, 'cośtam' | > FROM tabela | | A co w przypadki kiedy bede zmienial kolejnosc ... Bede chcial zamienic | kolejnosc w dwoch rekordach "obok siebie" |
W każdym z takich przypadków to użytkownik musi zadbać o właściwą kolejność. Chyba, że potrafisz podać regułę, jak ma się policzyć numer kolejny rekordu wyciągniętego z samego środka listy (ja takiej nie znam!). W bazach danych nie istnieje coś takiego jak Lp, wszelkie tego typu rozwiązania to protezy.
Pozdrawiam, Krzysiek
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[mysql] =?ISO-8859-2?Q?Za=E6mienie=2E=2E=2E_jak_wy=B6wietli=E6?==?ISO-8859-2?Q?=2E=2E=2E?=
[mysql] =?ISO-8859-2?Q?wielko=B6=E6_bazy_a_stabilno=B6=E6=2C?==?ISO-8859-2?Q?_podzia=B3_du=BFej_bazy_a_powi=B1zania_tabel?=
[MySQL] =?ISO-8859-2?Q?Wy=B6wietlenie_kolejnej_pozycji=2C_?==?ISO-8859-2?Q?jak=B1_mia=B3by_dany_rekord=2C_gdybym_czyta=B3 _?==?ISO-8859-2?Q?wg_konkretnych_kryteri=F3w=2E_Da_si=EA_=3F?=
[mysql 4.0.x] przenoszenie kolum =?ISO-8859-2?Q?mi=EAdzy_bazam?==?ISO-8859-2?Q?i_cd_=2E=2E=2E_?=
[MySQL] =?ISO-8859-2?Q?z=B3=B1czenie_tabeli_u=BFytkownik_i?==?ISO-8859-2?Q?_zdj=EAcia_z_wyborem_zdj=EAcia_domy=B6lnego?=
[MySQL] Jak =?ISO-8859-2?Q?wpisa=E6_do_tabeli_pozycje_dl?==?ISO-8859-2?Q?a_wierszy_gdybym_te_wiersze_wybiera=B3_w_ok?== ?ISO-8859-2?Q?re=B6lonej_kolejno=B6ci_=3F?=
Gdzie MySQL 4.1, a gdzie 5.0?
[MySQL 4.0...4.1] zabezpieczenie przed =?ISO-8859-2?Q?jednoczesn?==?ISO-8859-2?Q?=B1_edycj=B1?=
[MS SQL] "set names" (mySQL) w MS SQL
[mysql 5.x] jak =?ISO-8859-2?Q?zrealizowa=E6_zapytanie=3F_cz?==?ISO-8859-2?Q?yli_podzapytanie_i_wi=EAcej_ni=BF_jeden_rz=B1? ==?ISO-8859-2?Q?d_wynik=F3w?=
zanotowane.pldoc.pisz.plpdf.pisz.plkfia-tek.keep.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|