Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: relacje miedzy tabelami, klucze
Forum PHP.pl > Forum > Bazy danych > MySQL
zietek
Witam!


Tabela 1. Producenci

Kod
ID MARKA

1 Sony
2 Samsusng
3 Lg



Tabela 2. Towary

Kod
ID ID_PRODUCENTA NAZWA

1             2 monitor
2             2 telewizor
3             3 dvd-rom



Do tej pory dane wybieralem przy pomocy LEFT JOIN:

  1. SELECT Towary.ID
  2. Towary.ID_PRODUCENTA
  3. Towary.NAZWA
  4. Producenci.MARKA
  5. LEFT JOIN Producenci ON Producenci.ID = Towary.ID_PRODUCENTA
  6. FROM Towary


Stosujac ujemne wartosci w polu ID_PRODUCENTA (nie majace odpowiednikow w tabeli Producenci) okreslam np:
ID_PRODUCENTA = -1 gdy nieznany producent z terenu Europy
ID_PRODUCENTA = -2 gdy nieznany producent z terenu Azji
itd...

W takich przypadkach otrzymuje w wynikowym zapytaniu pole MARKA wypelnione wartoscia NULL a ujemna wartosc pola ID_PRODUCENTA wskazuje jaki

komunikat ma zostac wyswietlony przy danym produkcie z powodu braku producenta.

Minusem tej 'calej zabawy' jest koniecznosc sprawdzania przy usuwaniu rekordow z tabeli Producenci, czy nie ma jakis rekordow w tabeli Towary

podpietych pod usuwanego producenta.


Zdaje sobie sprawe, ze mozna to wykonac w sposob bardziej profesjonalny przy wykorzystaniu kluczy i relacji laczacych obie tabele.

Moze mi ktos podsunac pomysl?
Czy jest mozliwosc utowrzenia takiej relacji, ktora nie wymusza posiadania prawidlowego klucza przez tabele podrzedna (chodzi o ujemne

ID_PRODUCENTA)? Jezeli nie, to w jaki sposob rozwiazac ten problem?
nevt
przecież nic nie stoi na przeszkodzie, żebyś w tabeli Producenci miał dwa (puste) wpisy dla dla tych producentów z Azji i Europy - wtedy nie musisz kombinować z kluczami nie spełniającymi relacji...

co do kontroli towarów powiązanych z producentem, pole ID_PRODUCENTA w tabeli towary musisz zdefiniować jako klucz obcy z kaskadowym usuwaniem / aktualizacją, czyli stwórz tabele Towary następująco:

  1. CREATE TABLE `Towary` (
  2. `ID` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `ID_PRODUCENTA` int(10) UNSIGNED NOT NULL,
  4. `NAZWA` varchar(255) NOT NULL,
  5. PRIMARY KEY USING BTREE (`ID`),
  6. KEY `Producent_key` (`ID_PRODUCENTA`),
  7. CONSTRAINT `Producent_key` FOREIGN KEY (`ID_PRODUCENTA`) REFERENCES `Producenci` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE
  8. );
zietek
Ogolnie myslalem nad takim sposobem, jednak z gory nie wiem ile bedzie tych 'nietypowych kluczy'.
No i pole autoincrement ogranicza mnie z recznym wpisaniem tych danych np z ujemnymi warotsciami... musialy by one byc z kolejnego przydzialu.

Drugi problem jest taki, ze rekordy z takimi kluczami nie powinny byc widoczne w slowniku producentow.....tzn nie powinny byc traktowane jako pola edytowalne przez usera.

Cytat
przecież nic nie stoi na przeszkodzie, żebyś w tabeli Producenci miał dwa (puste) wpisy dla dla tych producentów z Azji i Europy - wtedy nie musisz kombinować z kluczami nie spełniającymi relacji...

A jest jakis sposob na wpisywanie kluczy obcych nie majacych swojego klucza podstawowego ?
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.