[ Pobierz całość w formacie PDF ]
.n])]REFERENCES ref_table [(ref_column [,.n])][ON UPDATE { CASCADE | NO ACTION}][ON DELETE { CASCADE | NO ACTION}][NOT FOR REPLICATION]Jak zwykle, nazwa powi¹zania (constraint) jest opcjonalna.Jak w przypadkuinnych wiêzów referencyjnych, nazwa kolumny nie musi byæ wywo³ywana lokalnieje¿eli jest to powi¹zanie pojedynczej kolumny.Równie¿ nie trzeba nazywaækolumny w innej tablicy, je¿eli kolumny maj¹ tak¹ sam¹ nazwê.Je¿eli nie zostanie okreœlony parametr ON UPDATE lub ON DELETE, obydwa s¹ustawione na NO ACTION aby zachowaæ zgodnoœæ z wczeœniejszymi wersjami SQLServera.Oznacza to, ¿e usuniêcie lub zmiany wartoœci klucza podstawowego nies¹ dozwolone je¿eli jakiekolwiek wiersze odwo³uj¹ siê do klucza podstawowego wtablicy (tablicach) z kluczem obcym.Je¿eli zostanie okreœlona opcja CASCADE, wiersze z tablicy (tablic) z kluczemobcym s¹ usuwane lub otrzymuj¹ odpowiednio zaktualizowan¹ wartoœæ kolumnyreferencyjnej.W przypadku odniesienia do powi¹zania unikalnego klucza podstawowego wielukolumn, nale¿y uwa¿aæ, aby odwo³ywaæ siê do nich w tej samej kolejnoœci naliœcie kolumn w listach FOREIGN KEY i REFERENCES.Obs³ugiwane s¹ równie¿odwo³ania w³asne, czyli mo¿na zastosowaæ odwo³anie tablicy do niej samej (zinn¹ kolumn¹).Nastêpuj¹cy kod tworzy tablicê pracowników i tablicê zamówieñ (która by³awype³niana przez pracownika).Aby sprawdziæ, czy odpowiedni pracownikwprowadzi³ zamówienie, mo¿na zaprogramowaæ tê w³asnoœæ lub zadeklarowaæ j¹ zkluczami obcymi.Nastêpnie, gdy ktoœ próbuje usun¹æ pracownika, osoba ta niejest uprawniona do wykonania tego dopóki s¹ zamówienia zwi¹zane z tympracownikiem.CREATE TABLE emp(emp_id int not null CONSTRAINT pk_emp PRIMARY KEY,emp_name char(30) not null)GoCREATE TABLE orders(order_id int not null CONSTRAINT pk_order PRIMARY KEY,emp_id int not null CONSTRAINT fk_orderFOREIGN KEY (emp_id) REFERENCES emp (emp_id)ON DELETE NO ACTION ON UPDATE NOACTION)GoINSERT emp VALUES (1,'Joe Smith')INSERT emp VALUES (2,'Ann Jones')INSERT orders VALUES (1,1)INSERT orders VALUES (2,2)GoPrzyk³ad ten dzia³a do tej pory poprawnie.Teraz nale¿y spróbowaæ wpisaæzamówienie dla nieistniej¹cego pracownika:INSERT orders VALUES (3,3)GoServer: Msg 547, Level 16, State 1, Line 1INSERT statement conflicted with COLUMN FOREIGN KEY constraint'fk_order'.The conflict occurred in database 'pubs',table 'emp', column 'emp_id'.The statement has been aborted.Nastêpnie nale¿y spróbowaæ usun¹æ pracownika, który posiada zamówienie:DELETE emp WHERE emp_id = 1GoServer: Msg 547, Level 16, State 1, Line1DELETE statement conflicted with COLUMN REFERENCE constraint'fk_order'.The conflict occurred in database 'pubs',table 'orders', column 'emp_id'The statement has been aborted.Przyk³ad odwo³ania siê do siebie samej mo¿e mieæ nastêpuj¹c¹ postaæ,oznaczaj¹c¹, ¿e ka¿dy mened¿er musi mieæ równie¿ poprawne dane jako pracownik:CREATE TABLE emp_manager(emp_id int not null CONSTRAINT pk_emp_mgr PRIMARY KEY,mgr_id int not null CONSTRAINT fk_emp_mgr FOREIGN KEYREFERENCES emp_manager (emp_id),emp_name char(30) not null)Te dwa polecenia insert zakoñcz¹ siê sukcesem, poniewa¿ odwo³uj¹ siê dopoprawnych danych:INSERT emp_manager VALUES (1,1, 'Ann Jones')INSERT emp_manager VALUES (2,1, 'Tom Smith')Warto jednak pamiêtaæ, ¿e je¿eli nast¹pi odwo³anie do osoby, która jeszcze nieistnieje, jak np.:INSERT emp_manager VALUES (3,4, 'Bob Newett')otrzyma siê komunikat podobny jak poprzednio — ¿e zosta³o naruszone powi¹zanieklucza obcego.Podejœcie to mo¿e byæ bardzo przydatne w wielu rzeczywistychscenariuszach.Kod z wydruku 14.1 dodaje tablicê zamówieñ szczegó³owych, która u¿ywa nowychmo¿liwoœci SQL Servera 2000 do kaskadowego usuwania lub wprowadzania danych.Wydruk 14 [ Pobierz caÅ‚ość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • listy-do-eda.opx.pl