Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: MySQL relacje insert itd.
Forum PHP.pl > Forum > Bazy danych > MySQL
tidnab
Cześć wszystkim.

Mam 2 tabele:

  1. CREATE TABLE `miasta` (
  2. `id_miejscowosci` int(5) NOT NULL AUTO_INCREMENT,
  3. `miejscowosc` varchar(255) NOT NULL,
  4. PRIMARY KEY (`id_miejscowosci`)
  5. ) ENGINE=InnoDB DEFAULT CHARSET=latin2;


i

  1. CREATE TABLE `noclegi` (
  2. `id` int(9) NOT NULL AUTO_INCREMENT,
  3. `nazwa` varchar(255) NOT NULL ,
  4. `kategoria` varchar(255) NOT NULL,
  5. `imie` varchar(255) NOT NULL,
  6. `nazwisko` varchar(255) NOT NULL ,
  7. `ulica` varchar(255) NOT NULL,
  8. `numer` varchar(255) NOT NULL,
  9. `id_miejscowosci` int(5) NOT NULL,
  10. `kod_pocztowy` varchar(255) NOT NULL,
  11. PRIMARY KEY (`id`),
  12. KEY `id_miejscowosci` (`id_miejscowosci`)
  13. ) ENGINE=InnoDB DEFAULT CHARSET=latin2;
  14.  
  15.  
  16. ALTER TABLE `noclegi`
  17. ADD CONSTRAINT `miasta_id_miejscowosci` FOREIGN KEY (`id_miejscowosci`) REFERENCES `miasta` (`id_miejscowosci`);



i teraz pytanie:
- Co mi daje ta relacja?
- Jeśli dodaje INSERTEM coś do tabeli noclegi to wcześniej muszę znać id_miejscowosci z tabeli miasta ?
- Czy baza nie może sama sprawdzić miasta.id_miejscowosci i dodać do noclegi.id_miejscowosci (w momencie kiedy coś do niej dodaję), a jeśli nie ma takiego id to dodać nowy rekord w miasta i dopiero wstawić to id do noclegi ? No bo chyba po to jest definiowana relacja? W innym przypadku po co ją definiować - można równie dobrze w pamięci sobie to wymyślić.

Uff trochę zamieszałem, ale mam nadzieję, że mi ktoś odpowie.
mwojcik
a) A do czego sluza relacje w bazie ? Do okreslenia zwiazkow miedzy danymi z rzeczywistosci. W tym przypadku relacja miasto <- nocleg okresla relacje, ze kilka noclegow moze byc przypisanych do jednego miasta (relacja wiele do jeden)
b) dodajac cos do tabeli noclegi musisz podac id_miasta (skad serwer bazy danych mialby wiedziec do jakiego miasta chcesz przypisac nocleg ?).
c)
Cytat
Czy baza nie może sama sprawdzić miasta.id_miejscowosci i dodać do noclegi.id_miejscowosci (w momencie kiedy coś do niej dodaję), a jeśli nie ma takiego id to dodać nowy rekord w miasta i dopiero wstawić to id do noclegi

Przy probie dodania rekordu do tabeli nocleg z id_miejscowosci, ktore nie istnieje serwer bazy danych wyrzuci wyjatek, gdyz dane te sa polaczone relacja, czyli kazda dodawana wartosc kolumny nocleg.id_miejscowosci musi sie wczesniej znajdowac w kolumnie miasto.id_miejscowosci.
Podczas dodawania nowego rekordu serwer sprawdza czy relacja istnieje i jezeli nie to wyrzuca blad - nie moze sam dodac nowego rekordu do tabeli miasta a potem do tabeli noclegi. Moze to zrobic uzytkownik za pomoca procedury, w pseudokodzie wygladaloby to mniej wiecej tak :

Kod
insert record into noclegi with value id_miejscowosci = n;  
if (is_thrown_exception) {
   insert record into miasta;  
   insert record into nocleg with value id_miejscowosci = get_last_insert_id from miasta;
   return;
}
return;


Za pomoca tak zdefiniowanej relacji mozesz latwo uzyskac dostep do informacji ktory nocleg jest w ktorym miescie, ile jest noclegow w miescie, ktore miasto ma najwiecej noclegow etc. wystarczy dobrze sformulowac zapytanie SQL.

Uff trochę zamieszałem, ale mam nadzieję, że troche rozjasnilem sytuacje.
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.