09. Z teorii do praktyki czyli "Data Definition Language"

09. Z teorii do praktyki czyli "Data Definition Language"

Autor: Grzegorz Chuchra

Opublikowano: 1/25/2006, 12:00 AM

Liczba odsłon: 77264

 „Z teorii do praktyki” to motto przewodnie poniższego artykułu. Kolejnych kilka stron będzie poświęconych poleceniom Data Definition Language (DDL). Za pomocą których możemy przeprowadzać operacje edycji i usuwania elementów w MS SQL Server 2005.

Teraz, kiedy już mamy głowę nabitą teorią, możemy przejść do praktycznego aspektu tworzenia baz danych. Stworzymy własny system bazodanowy zgodnie z projektem jaki został zrealizowany i znormalizowany na wcześniejszym kursie. Zaczynamy więc od wymienienia elementów języka Data Definition Language i wyjaśnieniu, czym jest sam język DDL. Używamy go zawsze wtedy, gdy tworzymy, usuwamy lub wstawiamy nowy obiekt do już istniejącego systemu. Inaczej mówiąc służy do zarządzania obiektami bazodanowymi. Podstawowe jego elementy to:

CREATE nazwa_obiektu tworzenia nowego obiektu
ALTER nazwa_obiektu wstawanie obiektu do istniejącego systemu
DROP nazwa_obiektu usuwanie istniejącego obiektu

Jednak praktycznie wszystkie powyższe operacje można wykonać bez konieczności pisania kodu, a jedynie za pomocą aplikacji dostępowej Microsoft SQL Server Management Studio. Teraz już kończę wywody i przechodzimy do tworzenia bazy.

Najpierw utworzymy bazę danych za pomocą skryptu SQL. W tym celu naciskamy na przycisk New Query, spowoduje to otwarcie nowego okna gdzie wprowadzimy nasz skrypt. W najprostszej postaci wymaga to jedynie wpisania jednej linii kodu.

CREATE DATABASE Deanery
GO

Teraz wystarczy tylko wcisnąć przycisk Execute (lub F5) i można już sprawdzić czy nasza baza danych została dodana. Niestety standardowo w okienku Object Explorer lista baz danych nie odświeża się automatycznie(dotyczy to wszystkich elementów i operacji na bazie). Aby zobaczyć wyniki konieczne jest odświeżenie korzenia Database w wyżej wymienionym oknie. Jest to jest pokazane na poniższym zrzucie ekranowym.

Jeśli umiemy już tworzyć bazę danych, chciałbym pokazać, jak można ją usunąć, a następnie ponownie utworzyć za pomocą GUI aplikacji. Aby usunąć całą bazę danych wystarczy tylko prawym guzikiem myszy kliknąć na obiekt, który chcemy usunąć. Następnie wybrać z menu podręcznego opcje Delete i potwierdzić wybór. Alternatywnie skrypt wyglądałby również dość nieskomplikowanie. Rożni się jedynie tym iż zamiast polecenia CREATE wstawiamy DROP:

DROP DATABASE Deanery
GO

Czym jest jednak pusta baza danych? Przejdźmy do tworzenia poszczególnych tabel i relacji pomiędzy nimi w taki sposób, aby odwzorować strukturę bazy którą zaprojektowaliśmy wspólnie we wcześniejszych rozdziałach.

Rozpoczynamy od utworzenia tabeli słownikowej zawierającej kraje z jakich pochodzą studenci studiujący na naszej uczelni.

CREATE TABLE [dbo].[Country]
(
        [CountryID] [int] IDENTITY (1, 1) NOT NULL PRIMARY KEY,
        [CountryName] [nvarchar] (64) NOT NULL
)
GO

@STRONA@

Ponieważ w naszej bazie klucze główne są wartościami całkowitymi musimy mieć pewność, iż każde następne wstawione państwo będzie miało unikalny w skali tabeli klucz główny. Aby sprostać temu zadaniu, dokładamy do klucza głównego klauzule IDENTITY (1, 1). Mówi ona tyle, że wartość będzie nadawana od wartości 1 i z każdym kolejnym nadanym ID będzie zwiększana. Jeśli byśmy użyli wyrażenia w następujący sposób IDENTITY (15, 3) to pierwszy wstawiony do bazy danych kraj miał by ID 15, a następny 18. Kolejnym interesującym nas polem jest wartość NOT NULL. Wspomnieliśmy o niej już wcześniej w rozdziale dotyczącym typów danych. Tu chciałbym tylko przypomnieć, że jeśli wartość kolumny w bazie danych jest ustawiona na NOT NULL oznacza, iż nie ma możliwości wstawienia do bazy danych rekordu, który będzie miał wartość nieokreśloną dla danej kolumny. W naszym konkretnym przypadku dotyczącym państw niemożliwe byłoby wstawienie wiersza, który nie ma podanej nazwy kraju. Dzięki temu, iż CountryID ma ustawioną IDENTITY, nie musimy dbać o wstawienie tam wartości. Serwer bazy danych sam zaopiekuje się uzupełnieniem pola oraz nadaniem unikalnego w ramach tabeli klucza. Dla krajów założyliśmy, że liczba liter nie będzie większa niż 64 znaki czyli „Zjednoczone Emiraty Arabskie” oraz „Stany Zjednoczone Ameryki Północnej” bez problemu zmieszczą się w przeznaczonym dla nich rekordzie. Dodatkowo umożliwiliśmy wpisywanie wszystkich znaków międzynarodowych (parz „Co to jest typ danych? Jakie typy danych dostarcza nam SQL Server 2005”).
Skrypty tworzące kolejne tabele będę mniej dokładnie opisywał. Skupię się na tych opcjach, które nie były przedstawione dotychczas.

CREATE TABLE [dbo].[Student]
(
            [StudentID] [int] IDENTITY (1, 1) NOT NULL PRIMARY KEY,
            [Firstname] [nvarchar] (64) NOT NULL ,
            [Lastname] [nvarchar] (64) NOT NULL ,
            [Birth] [datetime] NULL ,
            [EmailAdress] [nvarchar] (64) NULL ,
            [Mobile] [nvarchar] (16) NULL ,
            [CountryID] [int] NULL REFERENCES [dbo].[Country] ([CountryID])
)
GO

Jak łatwo zauważyć, kod tworzący tabelę jest dość intuicyjny. Jedyną obco wyglądającą linią może być ta ostatnia:

[CountryID] [int] NULL REFERENCES [dbo].[Country] ([CountryID])

Informuje ona serwer o tym, iż wartość CountryID w tabeli Student jest wartością, która musi się znajdować w tabeli Country w kolumnie CountryID. Podczas wstawiania nowego studenta system sprawdza czy identyfikator kraju znajduje się w tabeli Country. Gdybyśmy mieli w tabeli z krajami następujące wpisy:

To próba dodania następującego rekordu:

zakończyłaby się niepowodzeniem. Przyczyną tego jest fakt, iż w tabeli Country nie mamy kraju z CountryID = 7. Aby operacja zakończyła się powodzeniem, musielibyśmy najpierw wstawić do zbioru krajów rekord:

Teraz bez problemu możemy umieścić w naszym repozytorium wpis dotyczący pana nazywającego się Grzegorz Chuchra.

Po utworzeniu struktury danych opisujących studentów czas przejść do tabeli charakteryzującej przedmioty.

CREATE TABLE [dbo].[Subject]
(
            [SubjectID] [int] IDENTITY (1, 1) NOT NULL PRIMARY KEY,
            [SubjectName] [nvarchar] (64) NOT NULL ,
            [Type] [int] NULL
) GO

Skrypt tworzący jest analogiczny do tego, który posłużył nam do utworzenia tabeli zawierające dane o krajach. Dodaliśmy tylko pole z możliwością wpisania rekordu bez uzupełnienia tej wartości. Pole Type, bo o nim tu mowa, charakteryzuje rodzaj kursu - czy jest to zaliczenie, wykład, laboratoria itd.

Przechodzimy teraz do encji związanej z danymi o lektorach:

CREATE TABLE [dbo].[Lector]
(
            [LectorID] [int] IDENTITY (1, 1) NOT NULL PRIMARY KEY,
            [Firstname] [nvarchar] (64) NOT NULL ,
            [Lastname] [nvarchar] (64) NOT NULL ,
            [EmailAdress] [nvarchar] (64) NULL ,
            [Mobile] [nvarchar] (16) NULL ,
            [Phone] [nvarchar] (16) NULL ,
            [NIP] [nvarchar] (16) NULL ,
            [Salary] [float] NULL
)
GO

Po dokładnym przeanalizowaniu wcześniejszych skryptów wydaje mi się, że nie ma potrzeby rozwodzenia się nad tabelą Lector. Jest ona tożsama do Student z dokładnością do danych dotyczących wynagrodzenia i związanego z nim NIP-u.

Jeśli już opanowaliśmy tworzenie prostych relacji między obiektami bazodanowymi czas przejść do najbardziej skomplikowanej struktury w naszej bazie. Sam opis tabeli i charakter jej funkcjonowania został zawarty w rozdziale „Klucze główne, obce. Asocjacji.” Tu tylko ograniczę się do napisania skryptu, co jest znacznie prostszą operacją, aniżeli zaprojektowanie takiej struktury.

CREATE TABLE [dbo].[StudentLectorSubject]
(
            [StudentID] [int] NOT NULL REFERENCES [dbo].[Lector] ([LectorID]),
            [LectorID] [int] NOT NULL REFERENCES [dbo].[Student] ([StudentID]),
            [SubjectID] [int] NOT NULL REFERENCES [dbo].[Subject] ([SubjectID]),
            [Mark] [float] NULL,
            PRIMARY KEY ([StudentID], [LectorID], [SubjectID])
)

Jeśli już wiemy jak napisać skrypt tworzący bazę, chciałbym abyśmy przeszli do utworzenie tego samego za pomocą Management Studio. Jak zaraz zobaczymy jest to znacznie przyjemniejsze, a dodatkowo w każdym momencie możemy automatycznie wygenerować kod tworzący poszczególne obiekty, jak i całą bazę danych. Przedstawię, jak utworzyć strukturę dla tabelki Country, ponieważ utworzenie pozostałych tabel odbywa się na identycznej zasadzie, więc wydaje mi się, że nie ma potrzeby rozwodzenia się nad tym zagadnieniem. Ale koniec gadania - przechodzimy do pracy.

Standardowo zaczynamy od rozwinięcia katalogu z bazami danych istniejącymi na naszym serwerze. Odszukujemy bazę Deanery, naciskamy prawym guzikiem myszy na katalogu Tables. Z menu podręcznego wybieramy New Table… i przepisujemy kolejno dane ze skryptów. Jako pierwszą dodaliśmy encję Country, więc edycję rozpoczniemy właśnie od tej tabeli. Wpisujemy do pierwszej komórki zatytułowanej Column Name wartość CountryID, do Column Type int, a ostatnie pole checkBox pozostawiamy odznaczone. Tym sposobem wprowadziliśmy już większą część informacji dotyczącej kolumny. Teraz musimy przejść do zakładki Column Properties gdzie włączamy opcję autoinkrementacji (kolejnego nadawania ID dla klucza głównego). U mnie wygląda to następująco:

Podsumowanie

W rozdziale tym zapoznaliśmy się z zagadnieniem implementacji bazy danych. Wydaje mi się, że tworzenie bazy danych jest operacją mało skomplikowaną. Skrypty SQL ograniczają się do zapoznania z niewielką liczbą komend, a dodatkowym atutem jest możliwość skorzystania z narzędzi takich jak Microsoft SQL Server Management Studio wspomagających implementację zarówno z poziomu skryptów, jak i za pomocą interfejsu graficznego.

Jak wykorzystać Copilot w codziennej pracy? Kurs w przedsprzedaży
Jak wykorzystać Copilot w codziennej pracy? Kurs w przedsprzedaży

Wydarzenia