Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Transakcje i blokowanie, usuwanie danych
-Code46-
post
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ć?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
-Code46-
post
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:
  1. SELECT konta.login, dane.imie, dane.nazwisko
  2. 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 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
  1. 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)
  1. 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
Go to the top of the page
+Quote Post

Posty w temacie
- Code46   Transakcje i blokowanie   17.04.2005, 14:48:57
- - SongoQ   Mozna to zrealizowac na 2 sposoby. 1. Tabela typu...   17.04.2005, 15:12:27
- - Guest   Cytat(SongoQ @ 2005-04-17 14:12:27)Mozna to z...   17.04.2005, 19:30:31
- - Code46   Cytat(SongoQ @ 2005-04-17 14:12:27)Mozna to z...   17.04.2005, 23:11:05
- - SongoQ   CytatCo to jest ta tabela typu INNO DB? I kiedy st...   18.04.2005, 04:32:20
- - Code46   Cytat(SongoQ @ 2005-04-18 03:32:20)Podam moze...   18.04.2005, 09:31:41
- - SongoQ   CytatW tabelach które podałeś zamiast Kla_Use_id p...   18.04.2005, 09:54:26
- - Guest   No dobra ale jak to zrobić, żę usuwając jeden wpis...   18.04.2005, 13:13:42
- - matid   Cytat(Guest @ 2005-04-18 14:13:42)No dobra al...   18.04.2005, 13:50:38
- - SongoQ   Nie wystarczy ze zrobisz: [SQL] pobierz, plaintex...   18.04.2005, 14:37:59
- - Code46   PYTANIE 1 Hmm.. Chyba źle to robiłem. Najpierw nap...   18.04.2005, 19:34:00
- - SongoQ   CytatAle dlaczego tak się dzieje? Czy może to byc ...   18.04.2005, 20:02:49
- - Code46   CytatWsumie sam sobie odpowiedziales, dlatego sie ...   18.04.2005, 20:31:31
- - SongoQ   CytatJak dokładnie (np na przykładzie mojej tabeli...   18.04.2005, 21:08:10
- - Code46   CytatDla konta_id z tabeli dane tworzysz index, na...   18.04.2005, 22:34:19
- - SongoQ   [SQL] pobierz, plaintext CREATE TABLE `bb` (`a...   19.04.2005, 00:14:32
- - Code46   Ok ostatnie pytanie. Zrobiłem dwie tabele: [SQL] p...   19.04.2005, 11:13:32
- - SongoQ   CytatAle z tego co pisałeś wcześniej, odpowiedni w...   19.04.2005, 14:46:56
- - Code46   CytatAle typ powiazania ma byc CASCADE czyli. [SQ...   19.04.2005, 16:41:58
- - Code46   Działa Ostatnie pytanie. Uruchamiam transakcje k...   19.04.2005, 18:46:56
- - SongoQ   CytatMoim zdaniem to jest trochę tak od "pupy...   20.04.2005, 00:29:34
- - MiGoo   Proste pytanka: 1. czy polecenie "FOR UPDAT...   6.07.2006, 14:10:09
- - KG-   ad. 1) Nie, zostanie zignorowane. Blokowanie wiers...   6.08.2006, 21:54:04


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: 18.10.2025 - 13:14