Bardzo prosze o pomoc.
1. Poczytaj sobie, co to jest klucz obcy i czemu służy
2. Klucz obcy powinien być zaindeksowany. Masz 2 mozliwości
a) wartości w polu klucza mogą sie powtarzać:
ALTER TABLE tabela ADD INDEX _nazwa_indexu (klucz)
b) lub możesz wymusić sprawdzanie ich unikalności
ALTER TABLE tabela ADD UNIQUE _nazwa_indexu (klucz).
Klucz może składac się z kombinacji kilku pól
Pozdrawiam
Jakub
Z tego co kojarzę MySQL nie ma kluczy obcych. Ale może jest już jaka¶ nowsza
wersja.
> 1. Poczytaj sobie, co to jest klucz obcy i czemu służy
> 2. Klucz obcy powinien być zaindeksowany. Masz 2 mozliwości
> a) wartości w polu klucza mogą sie powtarzać:
>
> ALTER TABLE tabela ADD INDEX _nazwa_indexu (klucz)
>
> b) lub możesz wymusić sprawdzanie ich unikalności
>
> ALTER TABLE tabela ADD UNIQUE _nazwa_indexu (klucz).
>
> Klucz może składac się z kombinacji kilku pól
No cosik namieszałe¶. Klucz obcy NIE musi być indeksowany. Niektóre bazy
automatycznie indeksuj± klucz obcy, ale jest to bardzo niewydajny indeks.
No i ta niepowtarzalno¶ć. Klucz obcy niemal z definicji jest powtarzalny.
--
Pozdrawiam,
Tomasz Stański
> > > Witam Serdecznie.
> > > Tworzac relacje w Mysql'u w jaki sposob zdefiniowac KLUCZ OBCY ?
>
> Z tego co kojarzę MySQL nie ma kluczy obcych. Ale może jest już jakaś nowsza
> wersja.
>
Już są.
> > 1. Poczytaj sobie, co to jest klucz obcy i czemu służy
> > 2. Klucz obcy powinien być zaindeksowany. Masz 2 mozliwo ci
> > a) warto ci w polu klucza mogš sie powtarzać:
> >
> > ALTER TABLE tabela ADD INDEX _nazwa_indexu (klucz)
> >
> > b) lub możesz wymusić sprawdzanie ich unikalno ci
> >
> > ALTER TABLE tabela ADD UNIQUE _nazwa_indexu (klucz).
> >
> > Klucz może składac się z kombinacji kilku pól
>
> No cosik namieszałeś. Klucz obcy NIE musi być indeksowany. Niektóre bazy
> automatycznie indeksują klucz obcy, ale jest to bardzo niewydajny indeks.
> No i ta niepowtarzalność. Klucz obcy niemal z definicji jest powtarzalny.
W MySQL-u musi być. A nawet jeśli baza tego nie wymaga, to jest to zalecane.
Zauważ że bez tego indeksu na przykład usunięcie rekordu z tabeli master
musiałoby spowodować przejrzenie sekwencyjne całej tabeli w której
zdefiniowany jest klucz obcy, co byłoby bardzo niewydajne.
--
_/ _/ _/_/_/ ----- Rafał Jank rj...@wp-sa.pl -----
_/ _/ _/ _/ _/ Wirtualna Polska SA http://www.wp.pl
_/_/_/_/ _/_/_/ ul. Traugutta 115c, 80-237 Gdansk, tel/fax. (58)5215625
_/ _/ _/ --------==* http://szukaj.wp.pl *==----------
The FOREIGN KEY, CHECK, and REFERENCES clauses don't actually do
anything. The
syntax for them is provided only for compatibility, to make it
easier to port code from other
SQL servers and to run applications that create tables with
references. See section 1.7.4 MySQL
Differences Compared to ANSI SQL92.
> Zauważ że bez tego indeksu na przykład usunięcie rekordu z tabeli master
> musiałoby spowodować przejrzenie sekwencyjne całej tabeli w której
> zdefiniowany jest klucz obcy, co byłoby bardzo niewydajne.
Zgadza się.
Jeśli jednak mamy np. tabelę słownikową, to indeksowanie innej tabeli po
kluczu ze słownika jest zbędne.
--
Pozdrawiam,
Tomasz Stański
> > W MySQL-u musi być. A nawet jeśli baza tego nie wymaga, to jest to
> zalecane.
> No chyba nie jest tak jednoznaczne, bowiem zaleca się również, aby indeksy
> nie zawierały zbyt wielu powtarzających się wartości (a tak jest często z
> kluczem obcym). Jest to oczywiście kwestia konkretnego zastosowania i
> wyważenia, co jest w danym zastosowaniu ważniejsze.
>
Jeśli indeks będzie mało selektywny optymalizator po prostu z niego nie
skorzysta. Zostanie tylko dodatkowy narzut przy operacjach DML (co oczywiście
nie znaczy, że należy indeksować wszystkie kolumny ;).
a mozesz podac zrodlo Twoich informacji ? (ja zacytowalem tylko aktualna
dokumentacje mysql'a)
i co to zmienia ? przeciez pisze ze :
In MySQL Server 3.23.44 and up, InnoDB tables support checking of
foreign key constraints. See
section 7.5 InnoDB Tables. For other table types, MySQL Server does
parse the FOREIGN KEY
syntax in CREATE TABLE commands, but without further action being taken.
Założyliśmy (nie wiem czy słusznie), że zadający pytanie używa tabel typu
InnoDB, gdzie klucze obce działają.
chyba nie za bardzo slusznie, bo to nie sa domyslne tabele mysql :)