Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klucze obce
Forum PHP.pl > Forum > Bazy danych > MySQL
Jarod
Nie wiem dlaczego ale w nowym Mysqlu dzieje się dziwna rzecz.

Mam dwie tabele: konto i pracownik. Tabela konto zawiera login, hasło i klucz główny. W tabeli pracownik są dane osobiste i klucz główny z tabeli konto. Schemat tabel podaje na końcu posta..

Żeby pobrać dane użytkownika wydaję zapytanie:

  1. SELECT konto.konto_id, login, haslo, kto, imie, nazwisko, numer, dzial
  2. FROM konto,
  3. pracownik WHERE login='janek' AND konto.konto_id=pracownik.konto_id;


Taki jest poprawny sposób (wiżę obie tabele - podręcznikowy przykład). Ale ku mojemu zdziwieniu jak dam coś takiego:

  1. SELECT konto.konto_id, login, haslo, kto, imie, nazwisko, numer, dzial
  2. FROM konto,
  3. pracownik WHERE login='janek';


To też działa poprawnie i nawet szybciej. W MySQL 4.x nie przeszedłby ten patent.

Wiecie dlaczego MySQL sam sprawdza sobie powiązania?


TABELE:
  1. CREATE TABLE konto
  2. (
  3. konto_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  4. login VARCHAR(15) NOT NULL,
  5. haslo CHAR(40) NOT NULL,
  6. kto TINYINT NOT NULL
  7. ) TYPE = InnoDB;
  8.  
  9. CREATE TABLE pracownik
  10. (
  11. pracownik_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  12. konto_id INT NOT NULL,
  13. imie VARCHAR(20) NOT NULL,
  14. nazwisko VARCHAR(25) NOT NULL,
  15. numer INT NOT NULL,
  16. dzial CHAR(3) NOT NULL,
  17. CONSTRAINT FOREIGN KEY(konto_id) REFERENCES konto(konto_id)
  18. ) TYPE = InnoDB;
dr_bonzo
Wydaje mi sie ze zachodzi tutaj NATURAL JOIN (czy jak on sie tam nazywa) gdy tabele posiadaja identyczne pola (nazwa + typ), mysql zlacza wg. nich, a poza tym klucz obcy wskazuje w jaki sposob laczyc obie tabele.
Seth
Maly tip, moze sie przyda:

Od jakiegos czasu projektujac bazy robie to w taki sposob:

  1. CREATE TABLE konto
  2. (
  3. KON_ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  4. KON_Login VARCHAR(15) NOT NULL,
  5. KON_Haslo CHAR(40) NOT NULL,
  6. KON_Kto TINYINT NOT NULL
  7. ) TYPE = InnoDB;
  8.  
  9.  
  10. CREATE TABLE pracownik
  11. (
  12. PRA_ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  13. PRA_KON_ID INT NOT NULL,
  14. PRA_Imie VARCHAR(20) NOT NULL,
  15. PRA_Nazwisko VARCHAR(25) NOT NULL,
  16. PRA_Numer INT NOT NULL,
  17. PRA_Dzial CHAR(3) NOT NULL,
  18. CONSTRAINT FOREIGN KEY(PRA_KON_ID) REFERENCES konto(KON_ID)
  19. ) TYPE = InnoDB;


Dajac taka adnotacje do kolumn tabeli nie musimy juz stosowac dodatkowych zabiegow do rozpoznawania powiazanych kolumn oraz same zapytania sa bardziej czytelne.
Jarod
Cytat(dr_bonzo @ 2006-05-15 18:14:29)
Wydaje mi sie ze zachodzi tutaj NATURAL JOIN (czy jak on sie tam nazywa) gdy tabele posiadaja identyczne pola (nazwa + typ), mysql zlacza wg. nich, a poza tym klucz obcy wskazuje w jaki sposob laczyc obie tabele.

Tak myślałem. Ale rezygnując z tego dodatkowego porównania automatycznie skrypty przestaną działać ze starszą wersją mysqla.

Thx
dr_bonzo
Tu juz wybor nalezy do ciebie -- czy chcesz skorzystac z nowych funkcji czy zrobic kod kompatybilnym wstecz (do jakiejs sensownej granicy).
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.