Instytut Mechaniki i Inżynierii Obliczeniowej www.imio.polsl.pl fb.com/imiopolsl @imiopolsl fb.com/groups/bazydanychmt/ Wydział Mechaniczny technologiczny Politechnika Śląska Laboratorium 4 (Asocjacje, klucz główny, klucz obcy) 1
Informacje podstawowe Klucz główny każda tabela powinna posiadać klucz główny PRIMARY KEY (PK), powinien być on unikalny (niepowtarzający się). może on być pojedynczą kolumną (zazwyczaj numery indeksu, inwentarzowe, numery pesel itp.) lub kombinacją kolumn np. imie+nazwisko+miasto_urodzenia Przykładowa składnia SQL przy tworzeniu tabeli CREATE TABLE student ( nrindeksu int NOT NULL, Imie varchar(45) NOT NULL, Nazwisko varchar(45) NOT NULL, PRIMARY KEY (nrindeksu) ); Klucz obcy FOREIGN KEY (FK) wiąże kolumnę lub kolumny tabel z kolumną/kolumnami w innej (obcej) tabeli Kolumna obcej tabeli do której odwołuje się FK musi być typu UNIQE lub PK Wartość pola tabeli dla którego jest określony FK musi posiadać wartość która istnieje w tabeli obcej Asocjacja (połączenie) klucz główny klucz obcy zabezpiecza przed wprowadzeniem błędnych danych mogących spowodować utratę połączenia pomiędzy tabelami. Przykładowa składnia SQL przy tworzeniu tabeli (w powiązaniu do tabeli student) CREATE TABLE grupa_studentow ( nrindeksu int NOT NULL, nrgrupy int NOT NULL, PRIMARY KEY (nrindeksu), FOREIGN KEY (nrindeksu) REFERENCES student(nrindeksu) ); 2
1. Utwórz dwie powiązane ze sobą (klucz główny - klucz obcy) tabele o poniższych schematach Tabela oddzial, z następującymi atrybutami: id_oddzialu int NOT NULL, miejscowosc varchar(50), telefon varchar(12), Przy tworzeniu tej tabeli ustaw klucz główny na pole id_oddzialu! oraz tabela pracownik, z następującymi atrybutami: id_pracownika int NOT NULL, imie varchar(50), nazwisko varchar(50), id_oddzialu int NOT NULL, Przy tworzeniu tej tabeli ustaw klucz główny na pole id_pracownika oraz klucz obcy o nazwie id_oddzialu powiązany z polem id_oddzialu w tabeli oddzial! 2. Wypełnij tabele następującymi danymi: 3 Dodaj/usuń następujące informacje do tabel: a) Dodaj rekord do tabeli pracownik (za pomocą instrukcji SQL) dla następujących danych (id_pracownika 5, imie Grzegorz, nazwisko Voit, id_oddzialu 5) b) Dodaj rekord do tabeli pracownik (za pomocą instrukcji SQL) dla następujących danych (id_pracownika 6, imie Jan, nazwisko Szulc, id_oddzialu 2) c) Usuń rekord z tabeli oddział dla id_oddzialu=4 Dla każdego z powyższych zadań zanotuj informację zwracaną przez MySQL Workbench! 3
4. Komendą Reverese Engineer (wywoływaną z menu Database) utwórz i zachowaj diagram UML dwóch utworzonych i powiązanych ze sobą tabel. 5. Utwórz nowy model bazy danych (File->New Model) a w nim nowy diagram UML (Model->Add Diagram) 6. Utwórz 3 tabele o poniższych schematach. idelementu oraz idczesci tworzą klucz główny i nie mogą się powtórzyć (wspólnie) zaznaczone pola PK, NN idczesci zaznaczone pola PK, NN, UQ idelementu zaznaczone pola PK, NN, UQ 7. Utwórz asoscacje (złączenie klucz główny klucz obcy) w UML zgodnie z poniższym schematem. Kolumny (atrybuty) idelementu oraz idczesci mają być kluczem obcym w tabeli Elementy, połączone z odpowiednimi kluczami głównymi tabel Czesci oraz NazwaEl 4
Do utworzenia tych asocjacji wykorzystaj ikonę diagramów (rysunek poniżej) dostepną w pasku narzędziowym okna Narzędzie to tworzy asocjację wykorzystując istniejące kolumny tabel. Uwaga: Użycie innych narzędzi (ikon) powoduje powstanie nowej dodatkowej kolumny dla każdego utworzonego klucza obcego. 8. Wykonaj opcję Forward Engineer z menu Database. Po zakończonej operacji Forward Engineer przejdź do okna Navigatora MySQL Workbench. 9. Wypełnij tabele danymi tak jak w laboratorium nr 3, tj: 10. Zmień polecenie UPDATE w tabeli NazwaEl rekord idelementu równy 1002 na wartość 2. 11. Wyświetl dane ze wszystkich tabel poleceniem: SELECT * FROM elementy INNER JOIN czesci ON elementy.idczesci=czesci.idczesci INNER JOIN nazwael ON elementy.idelementu=nazwael.idelementu; oraz sprawdź skutek działania polecenia SQL z p.10. 5
12. Zmień parametry złączenia tabel. Użyj ikonki klucza, a następnie w opcjach klucza obcego zmień parametry z RESTRICT na CASCADE. Wykonaj to dla obydwu kluczy oraz obydwu opcji ON UPDATE, ON DELETE (rysunek poniżej). Uwaga: Opcja CASCADE umożliwia kaskadową zmianę zawartości połączonych tabel, tj. zmiana wartości w tabeli nadrzędnej (asocjacja po stronie klucza głównego) powoduje zmianę we wszystkich krotkach tabel podrzędnych (asocjacja po stronie klucza obcego). 13. Wykonaj ponownie polecenie z p. 10, a następnie sprawdź rezultat jego działania wykonując polecenie z p. 11. 6