Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyjaśnienie zasady działania - CONSTRAINT
Forum PHP.pl > Forum > Bazy danych > MySQL
maly_pirat
Cześć.

W Kohanie (FW) mamy moduł Auth.
Pod koniec zapytań SQL można zauważyć dodawanie "CONSTRAINT" - na czym to polega?

Choć najbardziej interesuje mnie dlaczego, skąd, po co jest to "ibfk_1" ?
Czy jeżeli będę tworzył inny moduł, który będę łączył za pomocą LEFT JOIN to też powinienem dodać taki klucz CONSTRAINT ?

Pozwolę sobie dodać też drugie pytanie skoro jesteśmy cały czas przy tych samych schematach.
-> Schemat dla users: UNIQUE KEY `uniq_username` (`username`),

Wiem co to znaczy UNIQUE, ale dlaczego uniq_username ? przeszukałem cały folder odpowiedzialny za Auth i nigdzie w zapytaniach nie zauważyłem np. SELECT uniq_username ? - Dlaczego akurat uniq_username ? - To się stosuje w zapytaniach, czy po prostu twórca tego modułu od tak nadał taką nazwę?
phpion
W obu przypadkach są to nazwy (odpowiednio) dla więzów integralności oraz indeksu. Nazwy te mogą być dowolne, możesz sobie wpisać w ich miejsce maly_pirat_123 czy cokolwiek. Co do tego jak działają więzy integralności to nie wydaje mi się sensowne wałkowanie tu tego - poszukaj w necie.
maly_pirat
Prawdę mówiąc niewiele znalazłem pod hasłem "więzy integralności", z konkretnych wyników to tylko ten wpis na blogu.

Więc weźmy pod przykład system newsów z komentarzami.
Kod
news_system > | news_id | autor_id | tytul | id_kategorii_news | opis |
kategorie > | id_kategorii | id_newsa | nazwa_kategorii |
tabela użytkowników > | id_user | username |
komentarze > | id_komentarza | id_newsa | tresc |


Więc ja zrobiłbym to w ten sposób:
dla id_kategorii_news dał KEY, dla autor_id nadałbym coś w stylu:
Kod
ADD CONSTRAINT `roles_users_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,


Aby nawiązać system newsów z systemem użytkowników.
To samo zastosować w przypadku kategorii do newsów,
oraz komentarzy do newsów - zgadza się?
nospor
Cytat
To samo zastosować w przypadku kategorii do newsów,
oraz komentarzy do newsów - zgadza się?
zalezy jak lezy.
jesli np. usuwając kategorie chcesz usunac tez wszystkie newsy to ok. Ale jesli nie chcesz pozwolic na usuniecie kategorii do ktorej nalezy jakis news, to musisz dac RESTRICT
maly_pirat
Dzięki za pomoc, dla obu Panów po punkcie pomógł. Choć zapytam się o jeszcze jedną kwestie, a dokładnie numerek, spójrzcie:

  1. // jest TO fragment wpisu z tabeli postów (skrypt: SMF)
  2. `posterIP` tinytext NOT NULL,
  3.  
  4. KEY `ipIndex` (`posterIP`(15),`ID_TOPIC`),


skąd ta "15"-stka? czemu dokładnie ma służyć ten klucz?
nospor
oznacza długośc pola.
maksymalne IP ma 15 znaków
maly_pirat
A jaki Typ powinienem dobrać dla kolumny ostatni_post_ID & ostatni_post_autorID - w newsach chce zapisywać kto napisał ostatniego posta i zrobić przekierowanie do niego, mam coś takiego:

Kod
    ADD CONSTRAINT `news_ibfk_2` FOREIGN KEY (`ostatni_post_ID`) REFERENCES `news_posty` (`ID_MSG`) ON UPDATE,
    ADD CONSTRAINT `news_ibfk_3` FOREIGN KEY (`ostatni_post_autorID`) REFERENCES `users` (`id`) ON UPDATE;


Tylko, że dostaje błąd w postaci:

Kod
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' ADD CONSTRAINT `news_ibfk_3` FOREIGN KEY (`ostatni_post_autorID`) REFERENCES' at line 3


Dodam, że podczas dodawania nie miałem selectboxa (html) aby wybrać ID_POSTU więc stąd może być ten błąd.
Jednak przecież jak mogę mieć selectboxa skoro news dopiero się dodaje , więc nie można od razu tak go skomentować.

Jakieś propozycje?
phpion
Cytat(maly_pirat @ 23.03.2010, 14:37:37 ) *
Jakieś propozycje?

Nie będę dublował wiedzy:

http://dev.mysql.com/doc/refman/5.1/en/inn...onstraints.html
Cytat
[CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name, ...)
REFERENCES tbl_name (index_col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]

reference_option:
RESTRICT | CASCADE | SET NULL | NO ACTION

Wytłuściłem to, co będzie przydatne.
maly_pirat
Jakiej opcji bym nie wybrał, zawsze zwróci mi (podczas dodawania wpisu - phpmyadmin) błąd

Kod
#1452 - Cannot add or update a child row: a foreign key constraint fails (`strona`.`news`, CONSTRAINT `news_ibfk_2` FOREIGN KEY (`ostatni_post_ID`) REFERENCES `news_posty` (`ID_MSG`) ON UPDATE CASCADE)
phpion
Bo zapewne nie masz zachowanej integralności danych więc założenie contrainta się nie powiedzie.
Cytat
Cannot add or update a child row

Czy na pewno wszystkie identyfikatory "dzieci" mają swoje odpowiedniki w tabeli "rodzica"? Czyli: czy wszystkie wartości w kolumnie ostatni_post_ID mają swój odpowiednik w tabeli news_posty w kolumnie ID_MSG? Pewnie nie - stąd masz błąd.
maly_pirat
OK, zadam ostatnie pytanie i można śmiało wątek zamknąć.

Czy jeśli dobrze nadam więzy integralności to będzie dobry krok w stronę optymalizacji zapytań łączących się np. z kategoriami newsów, komentarzami, itd ? Czy taka operacja jak dodawanie więzów nie ma wpływu na szybkość generowania się rekordu.
nospor
oczywiscie ze ma.
Jesli wiec rekordy dodajesz w liczbie milion na minute, to lepiej zostawic w spokoju takie rzeczy, ale jesli stosunkowo rzadko to relacje są jak najbardziej ok.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.