UWAGA! Promocja dla firm - MICROSOFT OFFICE 365  na 12 miesiecy ZA DARMO! Tylko na CentrumXP.pl!
Wielka promocja Office 365 na CentrumXP.pl!
Do góry Skomentuj

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

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

Autor: Grzegorz Chuchra Opublikowano: 25 stycznia 2006 Odsłon: 59 403

 „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

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.

Zobacz również

Komentarze

Czy w tej ostatniej tabeli StudentLectorSubject nie ejst coś pomylone?? Dlaczego StudentID odpowiada LectorID a LectorID odpowiada StudentID???
Mateo , 29 czerwca 2006, 21:27
Niewątpliwie jest błąd ;-)
skarbniq, 8 lipca 2006, 15:22
A jak powinno być poprawnie??
Dave, 24 lipca 2006, 13:43
kurs łokej
c330 ursus, 28 maja 2007, 21:44
Tylko czemu nie pokazał jak sie robi referencje (klucz obcy) z 1 tebeli do drugiej poprzez Management Studio ??
BJ, 4 czerwca 2007, 16:57
dlaczego jak tworzy się tabele za pomocą t-sql a nie za pomocą m-studio po odświerzeniu nie widać tych tabel w diagramie a jak się tworzy za pomocą m-studio to po refreszu odrazu są widoczne???????????
krecik, 4 lipca 2007, 12:36
Wlasnie, to samo dotyczy klucza glownego, bo wlaczenie auto increment nie jest jednoznaczne ze zdefiniowanie klucza glownego....
lewiS, 25 lipca 2007, 16:26
aby wszystko bylo widoczne tam gdzie powinno trzeba dopisac CREATE TABLE [nazwa bazy w jakiej tworzymy tabele">.[dbo">.[Student"> to zalezy czy logujemy sie do serwera bezposrednio do bazy czy tez nie
greg, 1 września 2007, 23:25
Jak narazie kurs ok, poza drobnym błędem :)
Tomek, 10 września 2007, 15:56
szkoda, że autorzy nie biorą pod uwagę komentarzy i nie wprowadzają zmian :-(
belfer, 27 listopada 2007, 14:53
wszędzie brakuje [Deanery">. jakby ktoś nie wiedział, chyba żę jest sie zalogowanym bezpośrednio do bazki :P
dziku, 20 stycznia 2008, 16:37
staram się czegoś nauczyć z tego kursu, utknąłem na tworzeniu klucza głównego i klucza obcego w Management Studio. Gdyby był opis jak to zrobić byłoby fajnie :(
yatre, 20 stycznia 2008, 21:27
yatre - naciśnij prawym przyciskiem myszy na kolumnie którą masz oznaczoną jako "NOT NULL" (w kolumnie ALLOW NULL"s nie może być zielonego) i wybierz polecenie "SET PRIMATY KEY" (po polsku to będzie ustaw klucz główny).
zch_pit, 18 maja 2008, 23:41
Wkradła mi się literówka. Oczywiście powinno być - SET PRIMARY KEY
zch_pit, 18 maja 2008, 23:42
... tak jakoś po łebkach i to w najważniejszym miejscu gdzie autor ograniczył się do napisania skryptu i nie powiedział o co kaman

GiWera, 6 kwietnia 2009, 22:35
Ostatnia tebela "StudentLectorSubject" chyba zawiera błąd jeśli chodzi o asocjacje studenta i lectora. Powinno być:

 
[StudentID"> [int"> NOT NULL REFERENCES [dbo">.[Student"> ([StudentID">),[LectorID"> [int"> NOT NULL REFERENCES [dbo">.[Lector"> ([LectorID">).

 
Nie wiem tylko dlaczego system nie widzi błędu i obydwie formy składni przepuszcza.
Może ktoś wie?

jachim, 7 czerwca 2009, 14:09
System przepuszcza obie formy bo formalnie obie są poprawne. Tyle tylko, że pierwszym sposobem (z "błędem") w tabeli "StudentLectorSubject" w kolumnie Student byłyby dane lektorów i na odwrót :)<br />



Adrian, 28 września 2009, 20:10
Pojęcie obiektu nie zostało zdefiniowane, a jest używane...
Pht, 1 grudnia 2011, 18:58

Dodaj swój komentarz

Zasady publikacji komentarzyZasady publikacji komentarzy

Redakcja CentrumXP.pl nie odpowiada za treść komentarzy publikowanych na stronach Portalu
i zastrzega sobie prawo do usuwania wypowiedzi, które:

  • zawierają słowa wulgarne, obraźliwe, prowokujące i inne naruszające dobre obyczaje;
  • są jedynie próbami reklamowania stron internetowych (spamowanie poprzez umieszczanie linków);
  • przyczyniają się do złamania prawa bądź warunków licencyjnych oprogramowania (cracki, seriale, torrenty itp.);
  • zawierają dane osobowe, teleadresowe, adresy mailowe lub numery GG;
  • merytorycznie nie wnoszą nic do dyskusji lub nie mają związku z tematem komentowanego newsa, artykułu bądź pliku.

Autor:

Komentarz:

Dodaj komentarz