Zdefiniowane klucze podstawowe oraz unikatowe indeksy mają bardzo duży wpływ na efektywność (szybkość) wykonywanych później poleceń. Można je tworzyć zarówno poprzez użycie odpowiednich funkcji w programie SQL Server Management Studio Express jak i poprzez polecenia języka SQL, podczas tworzenia/modyfikacji tabel. My pokażemy krótko jak tworzyć je wykorzystując narzędzie graficzne. Najpierw wybieramy określoną tabelę i używamy polecenia Modify:
Następnie na jednym lub wielu polach możemy użyć menu kontekstowego:
Polecenie Set Primary Key tworzy tzw. klucz podstawowy na wybranym polu/polach.
Oznaczony on będzie znakiem klucza przy danym polu:
Podczas jego tworzenia obowiązują podobne zasady jak podczas tworzenia tzw. "unikatowych indeksów": użyte pola nie mogą zawierać i akceptować wartości NULL, poza tym kombinacja wartości w nich zawartych nie może być powtarzalna w ramach więcej niż jednego rekordu. Innymi słowy - tworząc klucz podstawowy, powstaje dodatkowo indeks unikatowy, który jest sygnałem dla bazy danych w jaki sposób ma przeszukiwać określoną tabelę. W naszym przypadku (w tabeli sprzedaż), kluczem unikatowym może być jedynie pole "id" - tylko ono gwarantuje niepowtarzalność w każdym rekordzie.
Poza poprawą wydajności tabeli, indeksy unikatowe zabezpieczają także przed zapisaniem do tabeli danych z nimi niezgodnych - w sytuacji kiedy dwa pola są zdefiniowane jako indeksy unikatowe (czyli we wszystkich rekordach danej tabeli nie ma ich powtarzalnej kombinacji), serwer nie pozwoli na zapis rekordu, w którym użyjemy wartości łamiących tę regułę.
Poza kluczami podstawowymi i indeksami unikatowymi, mamy do dyspozycji także klucze zewnętrzne i zwykłe indeksy. Klucze zewnętrzne możemy definiować poprzez użycie polecenia:
I po jego wybraniu, możemy ustalić referencję danego pola do pola w innej tabeli:
Definiując konkretne relacje pomiędzy polami poszczególnych tabel (u nas możemy w ten sposób połączyć pole "id_prod" z tabeli "sprzedaz" z polem "id" z tabeli "produkty" - pamiętajmy jednak, aby wcześniej pole "id" z tabeli "produkty" ustawić jako klucz podstawowy - inaczej nie będziemy w stanie dokonać tego ustawienia):
Co ważne, podczas tworzenia takiej relacji, dane występujące w polach łączonych jako klucze zewnętrzne muszą pokrywać się z tymi które są w tabeli do której go tworzymy. U nas (patrz powyżej) kluczem bazowym jest pole "id" w tabeli "produkty" i wg niego może być potem wypełniane pole "id_prod" tabeli "sprzedaz". Jeśli w tabeli "sprzedaz" istnieje rekord z zawartością pola "id_prod", które nie występuje w polu "id" tabeli "produkty" - klucz nie zostanie utworzony.
Narzędzie to skutecznie zabezpiecza tabele baz danych przed wypełnieniem danymi niezgodnymi np. ze słownikami, gdyż jeśli teraz w naszej bazie mając w tabeli "produkty" tylko takie dane:
Spróbujemy dopisać rekord do tabeli "sprzedaz", w którym "id_prod" będzie różne od 1-5, to:
Otrzymamy błąd - informujący nas iż próba dodania rekordu zakończyła się niepowodzeniem, ze względu na nie spełnienie warunków zdefiniowanych w referencji pomiędzy tabelami.
Na koniec tego rozdziału warto wspomnieć o ciekawej funkcjonalności SQL Server - tabelach tymczasowych. Ich definicja oraz korzystanie jak i usuwanie wygląda identycznie jak normalnych tabel. Mają te same cechy i użyteczność jak normalne tabele. Różnią się tylko okresem ważności - utworzona tabela tymczasowa wraz z danymi, które zawiera - przechowywana jest w pamięci serwera tylko podczas trwania sesji danego użytkownika. W momencie, kiedy połączenie zostanie zerwane lub użytkownik się wyloguje z serwera tabela ginie bezpowrotnie (chyba, że użytkownik wydał polecenie jej usunięcia wcześniej - o czym warto pamiętać, żeby nie obciążać niepotrzebnie zasobów komputera przez zbyt długi okres). Osobiście używam tabel tymczasowych najczęściej dla uproszczenia sobie wielu bardzo złożonych zapytań - np. tam, gdzie potrzebowałem połączyć dane pochodzące z np. jednej tabeli ale zagregowane na zupełnie innych poziomach.
Aby zdefiniować tabelę tymczasową wystarczy poprzedzić jej nazwę znakiem "#" - jest to symbol dla programu, że ta tabela jest właśnie taką. Późniejsze do niej odwołania za każdym razem muszą także ten znak zawierać.