![]() |
![]() |
-Code46- |
![]()
Post
#1
|
Goście ![]() |
Witam!
Wkońcu natrafiłem na problem dotyczący kasowania danych z bazy mysql. Temat dotyczy bardziej bazy niż php ale mam nadzieję, że mi pomożecie.. Mam kilka tabel. Kasując informacje z jednej, muszę usunąć odpowiednie dane z innych tabeli. Wiem, że instrukcji DELETE nie można użyć tak jak select. Dla każdej tabeli należy wywołać osobno instukcję DELETE. Poczytałem sobi o trancakcjach i blokowaniu ale nie wiem jak to zastosować w praktyce. Chodzi mi o to, że gdy skasuję z tablei kont użytkownika, a z drugiej tabeli (tam gdzie mam dane o użytkownikach) nie uda się skaować odpowiedniego wpisu (np z nieznanych przyczyn) to tabelę z kontami doprowadzę do stanu z przed wykonani instrukcji DELETE, po to aby baza się nie posypała. Jak to zrobić? |
|
|
![]() |
-Code46- |
![]()
Post
#2
|
Goście ![]() |
PYTANIE 1
Hmm.. Chyba źle to robiłem. Najpierw napiszę dlaczego się nie zrozumieliśmy - przynajmniej mi się tak wydaje. Tworząc bazę popełniałem chyba błąd. Założmy że miałem dwie tabele KONTA i DANE. TABELA konta konta_id PRIMARY KEY login haslo TABELA dane dane_id PRIMARY KEY konta_id imie nazwisko adres telefon i np kiedy chciałem pobrać dane użytkownika o loginie root robiłem to tak:
Wtedy wypisywało mi dane które potrzebowałem - no niby ok.. I TUTAJ POJAWIA SI TEN HACZYK - CHYBA W książce do mysqla poczytałem o kluczach obcych. Dopiero wczoraj bo ten rozdział był dość daleko w książce. Jeśli usune z tabeli konta wiersz w którym zapisany jest login i hasło roota, to w tabeli dane pozostaje wpis dotyczący roota (tzn imie, nazwisko, adres, telefon roota. jeśli w tabeli konta root miał wartośc primary kay 1, to wlasnie ten wpsi jest w tabeli dane), zależności względem tabeli konta nie są usuwane z tabeli dane. I dlatego nie zrozumiałem co pisaliście. Ale dlaczego tak się dzieje? Czy może to byc wina (tak mi się wydaje) tego, że tworząć tabelę nie pisałem np dla tabeli dane CONSTRAINT i REFERENCE ? Jeśli tak to jak utworzyć taką tabele poprawnie? PYTANIE 2 Wracając do transakcji i blokowania. Jeszcze raz bardzo dokładnie pprzeczytałem ten rozdział. Poprawcie mnie jeśli się mylę: Domyślnymi tabelami w MySQL jest MyISAM. On nie obsługuje transakcji, ale obsługuje blokowanie. Jeśli chcę korzystać z transakcji to należy dodać odpowiedni wpis do pliku konfiguracyjnego albo na koncu polecenia tworzącego tabelę dopisać type = InnoDB. Tabele INNODB obsługują transakcje i blokowanie. Ale mam jeszcze pewne wątpliwości. a)Czy nie lepiej używać MyISAM i używać blokowanie tabeli? b)Czy lepiej przejść na tabelą INNODB i korzystać z transakcji? c)Jeśli korzystam z transakcji to korzytsać z opcji blokowania wierszy poprzez np
d)Jeśli chcę korzytsać z transakcji, ale nie wiem jaka wartość AUTOCOMMIT będzie ustawiona na serwerze, to czy muszę za każdym razem przed wykonaniem transakcji wykonywać zapytanie (w kodzie php) ? e) Jeśli nie zmienię wartości AUTOCOMMIT na 0 ( a domyślnie jest 1) to mogę korzystać z transakcji stosując zapis BEGIN WORK, COMMIT albo ROLLBACK? Czy nie wystąpi błąd? Proszę o dokładną odpowiedź POZDRAWIAM |
|
|
![]() ![]() |
![]() |
Aktualny czas: 18.10.2025 - 13:14 |