PYTANIE 1Hmm.. 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:
SELECT konta.login, dane.imie, dane.nazwisko
FROM konta, dane WHERE konta.login="root" AND konta.konta_id = dane.konta_id
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 2Wracają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
SELECT ... FOR UPDATE
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)
SET AUTOCOMMIT = 0;
?
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