Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00111 010375 11038340 na godz. na dobę w sumie
MySQL. Szybki start. Wydanie II - książka
MySQL. Szybki start. Wydanie II - książka
Autor: Liczba stron: 480
Wydawca: Helion Język publikacji: polski
ISBN: 83-246-0665-3 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> bazy danych >> mysql - programowanie
Porównaj ceny (książka, ebook, audiobook).

Błyskawiczny kurs użytkowania
jednej z najpopularniejszych baz danych

MySQL to system zarządzania bazami danych, dostępny na licencji open-source. Swoimi możliwościami nie ustępuje w niczym potężnym komercyjnym systemom. Wykorzystywany jest zarówno jako zaplecze bazodanowe witryn WWW, jak i źródło danych dla rozbudowanych aplikacji korporacyjnych. MySQL dostępny jest niemal dla wszystkich systemów operacyjnych. Ogromną zaletą jest jego prosta obsługa. Dzięki temu nawet początkujący użytkownicy szybko opanują wszystkie możliwości i wykorzystają je w pracy. Zaawansowani z pewnością docenią wydajność, stabilność i funkcje znane z 'kombajnów', takich jak Oracle lub MS SQL Server.

Książka 'MySQL. Szybki start. Wydanie II' to kolejna edycja przewodnika po podstawach korzystania z tej bazy danych. W tej książce, zaktualizowanej zgodnie z najnowszą wersją programu, znajdziesz informacje dotyczące instalowania MySQL, uruchamiania go w różnych systemach operacyjnych oraz administrowania nim. Nauczysz się zakładać bazy i tabele, wykorzystywać język SQL do manipulowania danymi w bazie oraz łączyć się z bazą danych z poziomu programów napisanych w różnych językach. Każde zagadnienie jest przedstawione na praktycznym, bogato ilustrowanym przykładzie, co doskonale pomoże Ci w przyswojeniu wiedzy.

Książka porusza następujące tematy:

Poznaj ogrom możliwości systemu MySQL.

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

IDZ DO IDZ DO PRZYK£ADOWY ROZDZIA£ PRZYK£ADOWY ROZDZIA£ SPIS TREœCI SPIS TREœCI KATALOG KSI¥¯EK KATALOG KSI¥¯EK KATALOG ONLINE KATALOG ONLINE ZAMÓW DRUKOWANY KATALOG ZAMÓW DRUKOWANY KATALOG TWÓJ KOSZYK TWÓJ KOSZYK DODAJ DO KOSZYKA DODAJ DO KOSZYKA CENNIK I INFORMACJE CENNIK I INFORMACJE ZAMÓW INFORMACJE ZAMÓW INFORMACJE O NOWOœCIACH O NOWOœCIACH ZAMÓW CENNIK ZAMÓW CENNIK CZYTELNIA CZYTELNIA FRAGMENTY KSI¥¯EK ONLINE FRAGMENTY KSI¥¯EK ONLINE Wydawnictwo Helion ul. Koœciuszki 1c 44-100 Gliwice tel. 032 230 98 63 e-mail: helion@helion.pl MySQL. Szybki start. Wydanie II Autor: Larry Ullman T³umaczenie: Pawe³ Gonera na podstawie „MySQL. Szybki start” w t³umaczeniu Marka Pa³czyñskiego ISBN: 83-246-0665-3 Tytu³ orygina³u: MySQL, Second Edition: Visual QuickStart Guide (2nd Edition) Format: B5, stron: 480 B³yskawiczny kurs u¿ytkowania jednej z najpopularniejszych baz danych MySQL to system zarz¹dzania bazami danych, dostêpny na licencji open-source. Swoimi mo¿liwoœciami nie ustêpuje w niczym potê¿nym komercyjnym systemom. Wykorzystywany jest zarówno jako zaplecze bazodanowe witryn WWW, jak i Ÿród³o danych dla rozbudowanych aplikacji korporacyjnych. MySQL dostêpny jest niemal dla wszystkich systemów operacyjnych. Ogromn¹ zalet¹ jest jego prosta obs³uga. Dziêki temu nawet pocz¹tkuj¹cy u¿ytkownicy szybko opanuj¹ wszystkie mo¿liwoœci i wykorzystaj¹ je w pracy. Zaawansowani z pewnoœci¹ doceni¹ wydajnoœæ, stabilnoœæ i funkcje znane z „kombajnów”, takich jak Oracle lub MS SQL Server. Ksi¹¿ka „MySQL. Szybki start. Wydanie II” to kolejna edycja przewodnika po podstawach korzystania z tej bazy danych. W tej ksi¹¿ce, zaktualizowanej zgodnie z najnowsz¹ wersj¹ programu, znajdziesz informacje dotycz¹ce instalowania MySQL, uruchamiania go w ró¿nych systemach operacyjnych oraz administrowania nim. Nauczysz siê zak³adaæ bazy i tabele, wykorzystywaæ jêzyk SQL do manipulowania danymi w bazie oraz ³¹czyæ siê z baz¹ danych z poziomu programów napisanych w ró¿nych jêzykach. Ka¿de zagadnienie jest przedstawione na praktycznym, bogato ilustrowanym przyk³adzie, co doskonale pomo¿e Ci w przyswojeniu wiedzy. Ksi¹¿ka porusza nastêpuj¹ce tematy: (cid:129) Instalacja MySQL w aplikacji Windows i Linuksie (cid:129) Konfiguracja serwera bazy danych (cid:129) Korzystanie z programu mysqladmin (cid:129) Projektowanie i tworzenie baz danych (cid:129) Wprowadzanie, pobieranie i modyfikowanie danych za pomoc¹ jêzyka SQL (cid:129) £¹czenie skryptów PHP i Perla z baz¹ danych MySQL (cid:129) Korzystanie z MySQL w programach napisanych w Javie (cid:129) Wyzwalacze i perspektywy (cid:129) Administrowanie serwerem MySQL Poznaj ogrom mo¿liwoœci systemu MySQL Spis treści Spis treści Wprowadzenie Rozdział 1. Instalowanie MySQL Ogólny opis instalacji Instalacja MySQL w systemie Windows Konfigurowanie MySQL w systemie Windows Instalowanie MySQL w systemie Linux Podstawowe opcje konfiguracyjne Uaktualnianie MySQL Rozdział 2. Uruchamianie MySQL Uruchamianie MySQL w systemie Windows oraz Windows NT Uruchamianie MySQL w systemach Linux i Unix Wykorzystywanie mysqladmin Ustawianie hasła użytkownika root Klient MySQL Użytkownicy i ich prawa Rozdział 3. Projektowanie bazy danych Normalizacja Klucze Relacje Pierwsza postać normalna Druga postać normalna Trzecia postać normalna Rozdział 4. Tworzenie bazy danych MySQL Typy danych MySQL Dodatkowe charakterystyki kolumn Wprowadzenie do indeksów Końcowy etap projektu Wybór maszyny zapisu Zestawy znaków i sposoby sortowania S p i s t r e ś c i 9 17 18 21 24 26 31 34 37 38 47 50 53 55 59 69 70 71 73 75 77 80 83 84 89 92 94 97 100 5 i c ś e r t s i p S Spis treści Tworzenie baz danych Tworzenie tabel Modyfikacja tabel Rozdział 5. Podstawy SQL Wykorzystywanie wartości w zapytaniach Wprowadzanie danych Pobieranie danych Wyrażenia warunkowe Użycie LIKE i NOT LIKE Złączenia Sortowanie wyników zapytania Ograniczanie liczby zwracanych wyników Uaktualnianie danych Usuwanie danych Rozdział 6. Funkcje MySQL Funkcje tekstowe Konkatenacja i aliasy Funkcje numeryczne Funkcje przetwarzania daty i czasu Formatowanie daty i czasu Funkcje szyfrowania Funkcje grupowania Pozostałe funkcje Rozdział 7. MySQL i PHP Łączenie z MySQL i wybieranie bazy danych Proste zapytania Przetwarzanie wyników zapytania Korzystanie z mysqli_insert_id() Obsługa błędów Bezpieczeństwo Rozdział 8. MySQL i Perl Instalacja Perla z obsługą MySQL w systemie operacyjnym Windows Instalowanie obsługi MySQL w Perlu w systemie operacyjnym Unix Testowanie Perla i MySQL Łączenie z MySQL 6 103 105 110 113 114 116 120 123 126 129 135 137 139 141 145 146 149 154 157 161 163 166 169 173 174 178 186 194 201 204 217 218 221 223 227 Przetwarzanie wyników zapytania Wykonywanie prostych zapytań Pozyskiwanie wartości InsertID Obsługa błędów Zagadnienia bezpieczeństwa Zastosowanie instrukcji przygotowanych Rozdział 9. MySQL i Java Instalacja sterownika MySQL dla Javy Łączenie z bazą danych Wykonywanie prostych zapytań Przetwarzanie wyników zapytania Pozyskiwanie wartości InsertID Zastosowanie instrukcji przygotowanych Rozdział 10. SQL i MySQL dla zaawansowanych Wykorzystywanie transakcji Przeszukiwanie typu FULLTEXT Wyrażenia regularne Zmienne definiowane przez użytkownika Wprowadzenie do unii Rozdział 11. Funkcje MySQL 5 Podprogramy przechowywane Zastosowanie parametrów OUT Wyzwalacze Perspektywy Rozdział 12. Techniki programowania Zapisywanie i pobieranie danych binarnych Tworzenie stron z wynikami zapytania Zastosowanie transakcji w języku Perl Rozdział 13. Administrowanie MySQL Program MySQL Administrator Tworzenie kopii zapasowych baz danych Importowanie danych Dzienniki pracy MySQL Utrzymanie bazy danych Podnoszenie wydajności Korzystanie z plików wsadowych Spis treści 230 234 239 242 246 249 255 256 259 266 273 280 286 291 292 299 309 312 315 321 322 342 345 350 357 358 376 390 399 400 404 408 410 413 417 421 7 S p i s t r e ś c i Spis treści Dodatek A Dodatek B Dodatek C i c ś e r t s i p S Rozwiązywanie problemów Instalacja Uruchamianie MySQL Dostęp do MySQL Problemy z mysql.sock Zapytania zwracające nieoczekiwane wyniki Problemy z protokołem uwierzytelniania Zmiana hasła użytkownika root Przegląd SQL i MySQL Podstawy SQL Polecenia ALTER Klauzule SQL Prawa dostępu MySQL Typy danych MySQL Funkcje MySQL Pozostałe informacje Źródła informacji Źródła specyficzne dla MySQL Aplikacje MySQL innych dostawców SQL PHP Perl Java Pozostałe źródła informacji Skorowidz 425 426 427 428 430 432 433 434 437 438 440 441 442 443 445 449 451 452 454 455 456 457 458 459 461 8 Tworzenie bazy danych MySQL Tworzenie bazy danych MySQL Rozdział 4. Tworzenie bazy danych MySQL W rozdziale 3., „Projektowanie bazy danych”, przedstawiłem operacje potrzebne do opracowania schematu bazy danych, które nazywane są normalizacją. Operacje te mogą być wykonywane w dowolnej relacyjnej bazie danych i nie są specyficzne dla MySQL. W tym rozdziale napiszę, w jaki sposób zaimplementować bazę danych w serwerze MySQL. Proces ten rozpoczniemy od zapoznania się z dostępnymi typami danych oraz sposobami ich dalszego dostosowywania. Kolejno poznamy indeksy poprawiające wydajność bazy danych, zakończymy projektowanie każdej z tabel przez wybranie właściwych nazw i wybierzemy typy tabel. Na koniec wrócimy do pracy z narzędziami MySQL, tworząc i być może modyfikując bazę danych i tabele. T w o r z e n i e b a z y d a n y c h M y S Q L 83 Rozdział 4. Typy danych MySQL Po zdefiniowaniu wszystkich wymaganych tabel i kolumn konieczne jest określenie typu danych przechowywanych w każdym z pól. Podczas tworzenia bazy danych (co zostanie przedstawione w następnym rozdziale) będzie wymagane określenie rodzaju informacji, które będą przechowywane w każdym z pól. Niemal każda baza danych opiera się na trzech ich kategoriach: (cid:88) tekst; (cid:88) liczby; (cid:88) data i czas. W każdej z wymienionych grup wyróżnia się kilka odmian typów danych, z których pewne są charakterystyczne jedynie dla MySQL. Właściwy wybór typu dla danej kolumny wpływa nie tylko na rodzaj informacji, jakie mogą być w niej gromadzone oraz na sposób ich przechowywania, ale również na całkowitą wydajność bazy danych. Wiele typów pozwala na określenie opcjonalnego atrybutu Długość (nawiasy kwadratowe — [] — oznaczają, że pomiędzy nimi można wstawić parametr opcjonalny, tymczasem nawiasy okrągłe odpowiadają argumentom obowiązkowym). L Q S y M h c y n a d y p y T Tabela 4.1. Znajduje się tu większość typów numerycznych, jakich można użyć w bazach danych MySQL. Dla typów FLAT, DOUBLE oraz DECIMAL argument Długość określa maksymalną liczbę cyfr, natomiast argument Pozycje określa liczbę cyfr po kropce dziesiętnej (od MySQL 5.0.3 rozmiar kolumny DECIMAL jest określany przez wyrażenie) Numeryczne typy danych MySQL Typ TINYINT[Długość] Rozmiar 1 bajt Opis Liczba z zakresu od –128 do 127 lub od 0 do 255, jeżeli jest typu UNSIGNED. Liczba z zakresu od –32 768 do 32 767 lub od 0 do 65 535, jeżeli jest typu UNSIGNED. Liczba z zakresu od –8 388 608 do 8 388 607 lub od 0 do 16 777 215, jeżeli jest typu UNSIGNED. Liczba z zakresu od –2 147 483 648 do 2 147 483 647 lub od 0 do 4 294 967 295, jeżeli jest typu UNSIGNED. Liczba z zakresu od –9 223 372 036 854 775 808 do 9 223 372 036 854 775 807 lub od 0 do 18 446 744 073 709 551 615, jeżeli jest typu UNSIGNED. Mała wartość zmiennoprzecinkowa. Duża wartość zmiennoprzecinkowa. Wartość typu DOUBLE ze stałą liczbą cyfr po przecinku. SMALLINT[Długość] MEDIUMINT[Długość] INT[Długość] 2 bajty 3 bajty 4 bajty BIGINT[Długość] 8 bajtów FLOAT[Długość,Pozycje] DOUBLE[Długość,Pozycje] DECIMAL[Długość,Pozycje] Długość + 1 lub 4 bajty 8 bajtów Długość + 2 bajty 84 Tworzenie bazy danych MySQL W tabeli 4.1 wymienione są typy numeryczne. Największa różnica występuje między typami całkowitymi i zmiennoprzecinkowymi (które zawierają kropkę dziesiętną). Następne różnice łatwo zauważyć w zakresie możliwych wartości (dla liczb całkowitych) lub poziomu dokładności (dla liczb zmiennoprzecinkowych). W tabeli 4.2 wymienione są typy tekstowe. Większość z nich różni się rozmiarem, ale kilka pozwala na przechowywanie danych binarnych zamiast ciągów znaków. Dostępne są również dwa rozszerzenia dla typów tekstowych — ENUM oraz SET — które umożliwiają definiowanie serii akceptowanych wartości w czasie tworzenia tabeli. Pole typu ENUM pozwala na użycie jednej z kilku tysięcy wartości, natomiast typu SET — na wybranie kilku z maksymalnie 64 możliwych wartości. Z typami ENUM i SET są związane dwie pułapki — typy te nie są obsługiwane w innych bazach danych i ich zastosowanie podważa zasady normalizacji. Opis Pole o stałej długości; długość od 0 do 255 znaków. Pole o stałej długości; długość od 0 do 255 znaków (od MySQL 5.0.3 65 535 znaków). Ciąg tekstowy o maksymalnej długości 255 znaków. Ciąg tekstowy o maksymalnej długości 65 536 znaków. Ciąg tekstowy o maksymalnej długości 16 777 215 znaków. Ciąg tekstowy o maksymalnej długości 4 294 967 295 znaków. Podobny do CHAR, ale przechowuje dane binarne. Podobny do VARCHAR, ale przechowuje dane binarne. Przechowuje dane binarne o maksymalnej długości 255 bajtów. Przechowuje dane binarne o maksymalnej długości 65 535 bajtów. Przechowuje dane binarne o maksymalnej długości 16 777 215 bajtów. Przechowuje dane binarne o maksymalnej długości 4 294 697 295 bajtów. Wyliczenie, które pozwala na to, by każda kolumna posiadała jedną z kilku możliwych wartości. Typ podobny do ENUM z tą różnicą, że może posiadać więcej niż jedną z dopuszczalnych wartości. 85 Tabela 4.2. Znajdują się tu najczęściej używane typy pozwalające na przechowywanie tekstu w bazie danych MySQL Tekstowe typy danych MySQL Typ CHAR[Długość] VARCHAR(Długość) Rozmiar Liczba bajtów Długość ciągu + 1 bajt T y p y d a n y c h M y S Q L TINYTEXT TEXT MEDIUMTEXT LONGTEXT BINARY[Długość] VARBINARY[Długość] TINYBLOB BLOB Długość ciągu + 1 bajt Długość ciągu + 2 bajty Długość ciągu + 3 bajty Długość ciągu + 4 bajty Długość bajtów Długość danych + 1 bajt Długość danych + 1 bajt Długość danych + 2 bajty MEDIUMBLOB Długość danych + 3 bajty LONGBLOB Długość danych + 4 bajty ENUM SET 1 lub 2 bajty 1,2,3,4 lub 8 bajtów Tabela 4.3. Dostępne w MySQL typy daty i czasu Typy danych MySQL Typ DATE Rozmiar 3 bajty DATETIME 8 bajtów TIMESTAMP 4 bajty TIME YEAR 3 bajty 1 bajt Opis Data w formacie: RRRR-MM-DD. Data i czas w formacie: RRRR-MM-DD GG:MM:SS. Znacznik czasowy w formacie: GG:MM:SS; zakres wartości kończy się w roku 2037. Znacznik czasowy w formacie GG:MM:SS. Rok w formacie RRRR i zakresie od 1901 do 2155. Rozdział 4. Różne typy dla daty i czasu (tabela 4.3) mają własne unikalne cechy, które są udokumentowane w podręczniku i opisywane w różnych fragmentach tej książki. Zazwyczaj z tych typów korzysta się bez modyfikacji, więc nie trzeba brać pod uwagę ich zawiłości. Wybierając typ danych: 1. Określ, czy kolumna będzie przechowywała dane tekstowe, liczbowe, czy też daty. Zazwyczaj jest to prosty i oczywisty etap. Do przechowywania wartości liczbowych należy użyć typu numerycznego. Jeżeli kolumna może zawierać wartości inne niż numeryczne, należy użyć kolumn tekstowych. W przypadku danych, takich jak kody pocztowe czy sumy pieniężne, które będą przechowywane wraz z dodatkowymi znakami (np. znak myślnika czy oznaczenie waluty), używa się pól tekstowych, choć zapisanie ich jako wartości liczbowych daje lepsze rezultaty. Problem formatowania będzie rozwiązywany w innymi miejscu. 2. Wybierz dla danej kolumny odpowiedni typ z danej kategorii. Mając na uwadze wysoką wydajność bazy danych, warto pamiętać, że: (cid:86) pola o stałej długości (jak CHAR) są zazwyczaj szybciej przetwarzane niż pola o zmiennej długości (jak VARCHAR), choć z drugiej strony zajmują więcej przestrzeni dyskowej — więcej informacji na ten temat zamieszczono we wskazówce; L Q S y M h c y n a d y p y T (cid:86) rozmiar każdego z pól powinien być ograniczony do najmniejszej możliwej wartości, którą można wyznaczyć, określając największą możliwą wartość wprowadzaną do danego pola; jeżeli przykładowo największa długość nazwy towaru będzie równa 20, to dla danej kolumny powinno się wybrać typ VARCHAR(20); (cid:86) należy pamiętać, że wprowadzenie pięcioznakowego ciągu tekstowego do pola typu CHAR(2) spowoduje obcięcie trzech ostatnich znaków, ta prawidłowość znajduje zastosowanie we wszystkich polach — jeżeli przekroczy się maksymalny zakres dla kolumny, cześć danych zostanie utracona. 86 Typ kolumny SMALLINT(4) Tabela 4.4. Innym aspektem projektowania bazy danych jest dobór optymalnego typu danych dla każdego z pól Baza danych finansów Nazwa kolumny Tabela Numer faktury Faktury Klient ID Faktury Data wystawienia faktury Faktury Faktury Wartość faktury Faktury Opis faktury Termin płatności Faktury Klienci Klient ID Klienci Nazwa klienta Klienci Ulica klienta Miasto klienta Klienci Klienci Stan klienta Klienci Kod pocztowy klienta Telefon klienta Klienci Osoba kontaktowa Klienci Adres e-mail kontaktowy Klienci Wydatki Wydatek ID Wydatki Kategoria wydatku ID Wartość wydatku Wydatki Wydatki Opis wydatku Wydatki Data zapłaty Kategorie Kategoria wydatku ID wydatków Kategorie wydatków SMALLINT(3) TIMESTAMP DECIMAL(10,2) TINYTEXT DATE SMALLINT(3) VARCHAR(40) VARCHAR(80) VARCHAR(30) CHAR(2) MEDIUMINT(5) VARCHAR(14) VARCHAR(40) VARCHAR(60) SMALLINT(4) TINYINT(3) DECIMAL(10,2) TINYTEXT DATE TINYINT(3) Kategoria wydatku VARCHAR(30) Tworzenie bazy danych MySQL W przypadku liczb należy się zdecydować, czy trzeba przechowywać część ułamkową. Decyzja ta dzieli nasz obszar zainteresowania na liczby całkowite i rzeczywiste. Jeżeli ważna jest dokładność matematyczna, należy użyć typu DECIMAL, który jest znacznie dokładniejszy niż FLOAT lub DOUBLE. 3. Ustal maksymalną długość kolumn tekstowych lub liczbowych (tabela 4.4). Zamiast rozpisywania się o sposobach i przyczynach takiego, a nie innego zdefiniowania wszystkich 22 przykładowych kolumn, wszystkie ich własności zestawiono w tabeli 4.4. Niektórzy programiści mogą mieć odmienne propozycje. Najistotniejsze jest jednak, aby dostosować każdy typ do rozmiarów przechowywanych informacji, zamiast korzystać zawsze z podstawowych (nieefektywnych) typów TEXT i INT. T y p y d a n y c h M y S Q L 87 Rozdział 4. Wskazówki (cid:132) Wiele z nazw typów posiada synonimy, np. INT — INTEGER, DEC — DECIMAL itd. (cid:132) Pole typu TIMESTAMP jest uaktualniane automatycznie podczas wykonywania polecenia INSERT czy UPDATE, nawet jeżeli dla danego pola nie określono żadnej wartości. W zależności od wersji MySQL, pola typu TIMESTAMP mają różne właściwości. (cid:132) Dostępny jest również typ BLOB, będący odmianą typu TEXT, który pozwala na przechowywanie w tabeli plików binarnych. Przykład użycia zostanie zaprezentowany w rozdziale 12. „Techniki programowania”. (cid:132) W polach daty i czasu MySQL dodatkowo sprawdza poprawność podanych danych w czasie ich wstawiania. Do wersji 5.0.2 dostępna była tylko podstawowa kontrola, czy miesiąc nie jest większy niż 12 i dzień większy niż 31. Od wersji 5.0.2 dodatkowo podany dzień musi istnieć w kalendarzu, np. jeżeli zostanie podana data 2006-02-31, zwrócony zostanie błąd daty. (cid:132) Rozmiar wymagany do zapamiętania ciągu znaków o zmiennej długości zależy również od wykorzystywanego zestawu znaków, np. znaki spoza alfabetu angielskiego mogą potrzebować więcej miejsca. L Q S y M h c y n a d y p y T 88 CHAR a VARCHAR Co do przewagi któregokolwiek z tych dwóch podobnych do siebie typów wciąż trwają dyskusje. Oba przechowują ciągi tekstowe i mogą być definiowane z podaniem maksymalnej jego długości. Podstawowa różnica polega na tym, że jakiekolwiek dane zapisane jako CHAR zawsze będą zapisywane jako ciąg tekstowy o długości określonej dla danej kolumny (wypełnienie znakami spacji). Z kolei długość ciągów tekstowych typu VARCHAR jest równa długości przechowywanego ciągu danych. Wynika z tego, że: (cid:141) kolumny VARCHAR zajmują mniej miejsca na dysku; (cid:141) kolumny CHAR są przetwarzane szybciej niż VARCHAR, o ile nie są stosowane typy tabel InnoDB (więcej informacji na ten temat zamieszczono w podrozdziale „Wybór maszyny zapisu” w dalszej części tego rozdziału). Trzeba przyznać, że w większości przypadków różnica w wielkości zajmowanego miejsca na dysku oraz w szybkości pomiędzy oboma typami jest niezauważalna, przez co rozważanie tego problemu nie ma szczególnego znaczenia. Co więcej, można czasami zauważyć, że pomimo zdefiniowania kolumny z użyciem jednego typu, MySQL skorzystał z drugiego. Istnieje jeszcze jedna, mniej istotna różnica pomiędzy omawianymi typami danych — przed wersją 5.0.3 MySQL usuwał nadmiarowe znaki spacji z kolumn CHAR podczas pobierania danych, a z kolumn VARCHAR podczas ich wstawiania. Od wersji 5.0.3 kolumny VARCHAR nie mają tej właściwości i wszystkie dodatkowe spacje są przechowywane. Jako zasadę można przyjąć korzystanie z typu VARCHAR, chyba że dana zawsze lub niemal zawsze ma taką samą długość, co czasami zdarza się w przypadku identyfikatorów produktów (SD123, PA456 itp.). Tworzenie bazy danych MySQL Dodatkowe charakterystyki kolumn Deklarując typ dla kolumny, na początku wybieramy szeroki typ — liczba, tekst lub data — a następnie wskazujemy dokładniejszy typ w danej grupie. Później kolumnie można nadać dodatkową charakterystykę. Specjalny atrybut, AUTO_INCREMENT, jest przedstawiony we wskazówce, ale można również korzystać z innych, takich jak UNSIGNED, ZEROFILL, NOT NULL oraz DEFAULT. Typy numeryczne mogą być określane jako UNSIGNED. Oznacza to, że w kolumnie takiej mogą być zapisywane tylko liczby nieujemne. W przypadku liczb całkowitych dodatkowym efektem ubocznym jest podwojenie możliwego zakresu wartości (dla liczb rzeczywistych tak nie jest). Typy numeryczne mogą być również deklarowane jako ZEROFILL, co oznacza, że dodatkowe miejsce jest wypełniane od lewej strony znakami zera (ZEROFILL automatycznie powoduje zastosowanie atrybutu UNSIGNED). Każda z kolumn może być zadeklarowana jako NOT NULL. W przypadku tworzenia bazy danych użycie NULL jest jednoznaczne z poinformowaniem, że dane pole nie przechowuje żadnej wartości (może się to różnić od interpretacji wartości NULL w innych kontekstach). Rozwiązaniem idealnym byłoby oczywiście przypisanie każdemu rekordowi bazy danych pewnej konkretnej wartości. W rzeczywistości jednak takie sytuacje zdarzają się rzadko. Dołączając do deklaracji typu ciąg NOT NULL możliwe jest wymuszenie takiego ograniczenia na danym polu. D o d a t k o w e c h a r a k t e r y s t y k i k o l u m n 89 Oznaczenie AUTO_INCREMENT Jednym z atrybutów kolumny numerycznej jest AUTO_INCREMENT. Jeżeli zdefiniujemy pole posiadające taką właściwość, powoduje to nadawanie przez MySQL następnej logicznej wartości z serii. Atrybut ten jest zwykle nadawany kolumnom klucza głównego, takim jak Numer faktury lub Identyfikator klienta. Jeżeli zdefiniujemy taką kolumnę, a podczas wstawiania wartości do tabeli nie zostanie podana w tej kolumnie wartość, program wstawi do niej następną logiczną wartość. Dzięki temu pierwszy numer faktury będzie miał wartość 1, drugi 2, trzeci 3 itd. MySQL będzie nadawał te wartości automatycznie. Niektórzy mogą zastanawiać się, co się stanie, gdy później zdecydujemy się skasować fakturę numer 3. W numeracji pojawi się „dziura”, ale taka sytuacja jest całkowicie prawidłowa. Nie ma żadnego problemu z powodu tego, że kolejne numery faktur będą miały wartości 1, 2, 4, 5, 8… W rzeczywistości problemy mogłyby się pojawić, jeżeli system próbowałby „poprawić tę sytuację. Rozdział 4. Tworząc tabelę, można również określić wartość domyślną dla kolumny (poza typami TEXT i BLOB). Wtedy gdy duża część rekordów będzie miała taką samą zawartość, wartość domyślna pozwala uniknąć konieczności wpisywania wszystkich wartości w czasie wstawiania nowych wierszy, pod warunkiem, że wartości te są równe wartości domyślnej. Przykładem takiej deklaracji kolumny może być: plec ENUM( M , K ) DEFAULT K . W tabeli 4.5 wymienione są wszystkie kolumny z bazy finanse, wraz z ich pełną definicją. n m u l o k i k y t s y r e t k a r a h c e w o k t a d o D Tabela 4.5. Do każdej z kolumn można w razie potrzeby dodać dodatkowe atrybuty Baza danych finanse, zmodyfikowana Tabela Nazwa kolumny Numer faktury Faktury Faktury Klient ID Faktury Data wystawienia faktury Faktury Wartość faktury Opis faktury Faktury Faktury Termin płatności Klienci Klient ID Nazwa klienta Klienci Klienci Ulica klienta Klienci Miasto klienta Klienci Stan klienta Kod pocztowy klienta Klienci Klienci Telefon klienta Klienci Osoba kontaktowa Klienci Adres e-mail Wydatek ID Wydatki Wydatki Kategoria wydatku ID Wydatki Wartość wydatku Wydatki Opis wydatku Data zapłaty Wydatki Kategorie wydatków TIMYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT Kategoria wydatku ID Kategoria wydatku Kategorie wydatków VARCHAR(30) NOT NULL Typ kolumny SMALLINT(4) UNSIGNED NOT NULL AUTO_INCREMENT SMALLINT(3) UNSIGNED NOT NULL TIMESTAMP NOT NULL DECIMAL(10,2) UNSIGNED NOT NULL TINYTEXT NOT NULL DATE SMALLINT(3) UNSIGNED NOT NULL AUTO_INCREMENT VARCHAR(40) NOT NULL VARCHAR(80) NOT NULL VARCHAR(30) NOT NULL CHAR(2) NOT NULL MEDIUMINT(5) UNSIGNED ZEROFILL NOT NULL VARCHAR(14) VARCHAR(40) VARCHAR(60) SMALLINT(4) UNSIGNED NOT NULL AUTO_INCREMENT TINYINT(3) UNSIGNED NOT NULL DECIMAL(10,2) UNSIGNED NOT NULL TINYTEXT NOT NULL TIMESTAMP NOT NULL 90 Tworzenie bazy danych MySQL Gdy chcesz dostosować kolumny: 1. Wyszukaj te, które nie mogą zawierać wartości NULL. Jest to najważniejszy z dodatkowych atrybutów. Każda kolumna oznaczona jako NOT NULL zawsze musi mieć podaną wartość. Jak się okaże przy okazji dodawania rekordów, brak podanej wartości w kolumnie NOT NULL powoduje wygenerowanie błędu. Jako zasadę należy przyjąć definiowanie kolumny jako NOT NULL wszędzie tam, gdzie jest to możliwe. 2. Wyszukaj kolumny numeryczne, które powinny być oznaczone jako UNSIGNED. Jest to bardzo łatwa operacja. Jeżeli liczba, która znajdzie się w kolumnie, musi być dodatnia, tak jak cena lub ilość, kolumna powinna być oznaczona jako UNSIGNED. Jeżeli liczba może być ujemna, jak np. temperatura lub stan konta (niestety!), nie należy kolumny tak oznaczać. 3. Wyszukaj kolumny numeryczne, które powinny być oznaczone jako ZEROFILL. Atrybut ZEROFILL jest znacznie rzadziej wykorzystywany niż UNSIGNED, ale w niektórych przypadkach jest niezbędny. Niektóre kody zaczynają się od 0, tak jak np. 02101. Jeżeli chcielibyśmy zapisać taki kod w kolumnie całkowitej, wartość ta zostałaby zapisana jako 2101 (ponieważ początkowe zera nie mają znaczenia w liczbach całkowitych). Jeżeli zdefiniujemy kolumnę jako MEDIUMINT(5) UNSIGNED ZEROFILL, zapisany kod zachowa początkowe zero. 4. Wyszukaj kolumny, które powinny mieć wartość domyślną. Krok ten jest w zasadzie zależny od osobistych upodobań. D o d a t k o w e c h a r a k t e r y s t y k i k o l u m n 91 Wskazówki (cid:132) Zgodnie ze sztuką projektowania bazy danych oraz zasadami funkcjonowania MySQL klucze główne nie mogą zawierać wartości NULL. (cid:132) Jeżeli kolumna ENUM zostanie określona jako NOT NULL, wówczas pierwsza dopuszczalna wartość stanie się wartością domyślną. (cid:132) Istotnym jest, aby mieć świadomość, że NULL nie jest wartością równoznaczną z zerem, pustym ciągiem ( ) czy znakiem spacji ( ), które to są znanymi wartościami. (cid:132) Trzeba wiedzieć, że MySQL w dziwny sposób obsługuje liczby UNSIGNED. Jeżeli wykonamy odejmowanie z co najmniej jedną liczbą UNSIGNED, wynik zawsze będzie UNSIGNED. Przez to odjęcie od wartości 2 z kolumny UNSIGNED wartości 10 z kolumny SIGNED nie da w wyniku –8. Rozdział 4. Wprowadzenie do indeksów Indeksy składają się na szczególny system, wykorzystywany do poprawienia całościowej wydajności bazy danych. Ustalając indeksy w ramach tabeli, wskazuje się kolumny, które są w danej tabeli ważniejsze od innych kolumn tej samej tabeli (definicja dla laików). MySQL pozwala na utworzenie maksymalnie od 16 do 64 indeksów dla jednej tabeli, w zależności od wykorzystywanej maszyny zapisu, a każdy z nich może obejmować do 15 kolumn. Wykorzystanie indeksów wielokolumnowych nie musi się wydawać takie oczywiste, jednak stają się użyteczne w przypadku częstego przeszukiwania grupy tych samych kolumn (np. zawierających dane na temat imienia, nazwiska, miasta i województwa). W stosowaniu indeksów wskazany jest umiar. Zwiększają one, co prawda, szybkość odczytu danych z bazy, ale spowalniają proces ich modyfikacji (z uwagi na fakt, że zmiany muszą być odwzorowane także w indeksach). Z drugiej strony, zwykle znacznie częściej odczytuje się dane z tabeli, niż wstawia nowe rekordy i zmienia istniejące. Najlepszym zastosowaniem dla indeksów jest użycie ich w kolumnach, które: (cid:88) są często wykorzystywane w części WHERE zapytań; (cid:88) są często wykorzystywane w części ORDER BY zapytań; (cid:88) cechują się różnorodnością wartości (kolumny, w których wartości powtarzają się wielokrotnie nie powinny być indeksowane). (cid:88) są często stosowane w wyrażeniach JOIN. w ó s k e d n i o d e i n e z d a w o r p W 92 Tabela 4.6. W celu zwiększenia wydajności baza danych została wzbogacona o kilka (choć nie jest ich zbyt wiele) indeksów, które pozwolą jej na efektywniejsze pobieranie przechowywanych informacji Indeksy bazy danych finansów Kolumna Numer faktury Klient ID Data wystawienia faktury Faktury Wartość faktury Faktury Termin płatności Klienci Klient ID Klienci Nazwa klienta Wydatek ID Wydatki Kategoria wydatku ID Wydatki Wartość wydatku Wydatki Data zapłaty Wydatki Kategoria wydatku ID Kategorie wydatków Kategorie wydatków INDEX INDEX PRIMARY KEY INDEX (lub UNIQUE) PRIMARY KEY INDEX INDEX INDEX PRIMARY KEY Kategoria wydatku Tabela Faktury Faktury Faktury Typ indeksu PRIMARY KEY INDEX INDEX UNIQUE W MySQL wyróżnia się kilka typów indeksów: INDEX, UNIQUE (narzucający konieczność wprowadzania unikatowej wartości w każdym wierszu) oraz PRIMARY KEY (będący szczególną postacią indeksu UNIQUE). Dostępny jest również indeks FULLTEXT, który jest opisany w rozdziale 10., „SQL i MySQL dla zaawansowanych”. Propozycje indeksów dla bazy danych finanse zestawiono w tabeli 4.6. Tworzenie bazy danych MySQL W celu dodania indeksu: 1. Wyszukaj wszystkie kolumny, które powinny być oznaczone jako PRIMARY KEY. Powinno być to oczywiste szczególnie wtedy, jeżeli wykonałeś operacje normalizacji opisaną w poprzednim rozdziale. Należy pamiętać, że może istnieć tylko jeden klucz główny w tabeli (choć możliwe jest tworzenie złożonego klucza głównego składającego się z wielu kolumn). 2. Wyszukaj wszystkie kolumny, których wartości muszą być zawsze unikalne. Również indeks UNIQUE nie jest wykorzystywany zbyt często. Większość wartości — daty, liczby, nazwy, miasta, kody pocztowe — mogą się powtarzać, szczególnie w tabelach zawierających tysiące wierszy. Jednak czasami okazuje się, że kolumna musi zawierać unikalne wartości, np. adres e-mail, nazwa użytkownika (w przypadku systemów do rejestracji lub logowania) lub też pole Kategoria wydatku w tabeli Kategorie wydatków. Nie ma potrzeby definiowania kolumn PRIMARY KEY jako UNIQUE, ponieważ oznaczenie PRIMARY KEY również powoduje unikalność. 3. Wyszukaj wszystkie pozostałe kolumny, które powinny skorzystać z indeksu. Skorzystaj z wcześniejszych zaleceń na temat miejsc, w których warto tworzyć indeksy i pomyśl jakie dane będą odczytywane. Jeżeli potrzebna będzie lista faktur w zakresie dat lub całkowita wartość zamówienia, utwórz indeksy w logiczny sposób. Jeżeli tabela rejestracji i logowania będzie przeszukiwana z użyciem połączenia nazwy użytkownika i hasła, w taki sam sposób powinna być poindeksowana. Powinno się również indeksować klucze obce. 93 W p r o w a d z e n i e d o i n d e k s ó w Wskazówka (cid:132) Indeksy stosowane w kolumnach o zmiennej długości cechuje mniejsza wydajność. Ogólnie, stosowanie pól, których długość nie jest stała, spowalnia pracę MySQL. Można to skompensować indeksując tylko część ciągu o zmiennej długości, np. pierwsze pięć lub dziesięć znaków. u t k e j o r p p a t e y w o c ń o K Rozdział 4. Końcowy etap projektu Ostatnim etapem projektowania bazy danych jest zastosowanie odpowiedniej konwencji nazewnictwa. Co prawda, MySQL nie narzuca zasad nazywania baz danych, tabel czy kolumn, istnieją jednak pewne sprawdzone reguły, których należy przestrzegać (zasady wymagane są zaznaczone pogrubieniem): (cid:88) używanie znaków alfanumerycznych; (cid:88) nie korzystanie ze spacji; (cid:88) ograniczenie maksymalnej długości nazw do 64 znaków; (cid:88) nazwy pól powinny mieć charakter opisowy; (cid:88) nazwy pól, z wyjątkiem kluczy, powinny być unikatowe w obrębie wszystkich tabel; (cid:88) nie należy korzystać ze słów kluczowych MySQL; (cid:88) używanie znaków podkreślenia (_) w celu rozdzielania wyrazów; (cid:88) korzystanie tylko z małych liter (choć nie jest to rzecz obowiązkowa); (cid:88) używanie liczby mnogiej w oznaczaniu tabel i pojedynczej w definiowaniu kolumn; (cid:88) dołączanie id (lub ID) do nazw kolumn kluczy głównych i obcych; (cid:88) umieszczanie kluczy głównych w początkowej części tabeli, a w dalszej kolejności kluczy obcych. Zamieszczone powyżej reguły mają jedynie charakter zalecenia, ich przestrzeganie, poza koniecznością posługiwania się znakami alfanumerycznymi bez znaków spacji, nie jest zatem obowiązkowe. Część programistów preferuje używanie wielkich liter do rozdzielania wyrazów (zamiast znaku podkreślenia). Inni z kolei uwzględniają w nazwie kolumny jej typ. Najistotniejsze jest jednak to, by przestrzegać ustalonej konwencji. 94 Tworzenie bazy danych MySQL Ostateczny projekt bazy danych przedstawiono w tabeli 4.7, który otrzymamy po wykonaniu kolejnych kroków. W celu dokończenia projektowania bazy danych: 1. Określ nazwę całej bazy danych. Powinna być ona łatwa do zapamiętania i opisowa. Nazwa bazy danych również musi być unikalna, ponieważ na jednym serwerze MySQL nie mogą istnieć bazy danych o takich samych nazwach. Przykładowo w tym i poprzednim rozdziale korzystaliśmy z bazy finanse. Można ją również nazwać Finanse, ale osobiście preferuję nazwy zawierające tylko małe litery. Tabela 4.7. Ostatni etap projektu polega na zastosowaniu odpowiedniej konwencji nazewnictwa oraz uporządkowania kolumn w tabelach Baza danych finanse Nazwa kolumny faktura_id klient_id data_faktury wartosc_faktury opis_faktury data_platnosci klient_id nazwa_klienta ulica_klienta miasto_klienta stan_klienta kod_pocztowy_klienta telefon_klienta osoba_kontaktowa email_kontaktowy wydatek_id kategoria_wydatku_id wartosc_wydatku opis_wydatku data_zaplaty kategoria_wydatku_id kategoria_wydatku Typ kolumny SMALLINT(4) UNSIGNED NOT NULL AUTO_INCREMENT SMALLINT(3) UNSIGNED NOT NULL TIMESTAMP NOT NULL DECIMAL(10,2) UNSIGNED NOT NULL TINYTEXT NOT NULL DATE SMALLINT(3) UNSIGNED NOT NULL AUTO_INCREMENT VARCHAR(40) NOT NULL VARCHAR(80) NOT NULL VARCHAR(30) NOT NULL CHAR(2) NOT NULL MEDIUMINT(5) UNSIGNED ZEROFILL NOT NULL VARCHAR(14) VARCHAR(40) VARCHAR(60) SMALLINT(4) UNSIGNED NOT NULL AUTO_INCREMENT TINYINT(3) UNSIGNED NOT NULL DECIMAL(10,2) UNSIGNED NOT NULL TINYTEXT NOT NULL TIMESTAMP NOT NULL TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT VARCHAR(30) NOT NULL Tabela faktury faktury faktury faktury faktury faktury klienci klienci klienci klienci klienci klienci klienci klienci klienci wydatki wydatki wydatki wydatki wydatki wydatki_kategorie wydatki_kategorie 95 K o ń c o w y e t a p p r o j e k t u u t k e j o r p p a t e y w o c ń o K Rozdział 4. 2. Określ nazwę każdej tabeli. Należy pamiętać, że powinny być one łatwe do zapamiętania i opisowe. Dodatkowo, w jednej bazie danych nie mogą istnieć dwie tabele o takich samych nazwach (tabele w różnych bazach mogą mieć te same nazwy). Zdecydowałem się na tabele faktury, klienci, wydatki i wydatki _kategorie. 3. Nadaj nazwę każdej kolumnie w każdej tabeli. W tym przypadku można spotkać się z wieloma wariantami, ponieważ każdy ma swój styl. Jak wspomniałem, do kolumn kluczy głównych i obcych dodałem frazę _id. Jeżeli w tabeli znajduje się pole z datą, w jej nazwie umieszczam frazę data. 4. Uporządkuj kolumny w każdej z tabel. Wyniki tego kroku zależą bardziej od własnej organizacji niż innych względów. Kolejność kolumn nie ma żadnego wpływu na działanie tabeli lub bazy danych. Osobiście umieszczam kolumny klucza głównego na początku, a następnie układam klucze obce. Wskazówki (cid:132) Jeżeli związanym tabelom zostaną nadane nazwy rozpoczynające się tak samo, to gdy wyświetlimy listę tabel, będą one wyświetlane razem. Przykładem są tabele wydatki i wydatki_kategorie, które na rysunku 4.1 są wyświetlane razem). (cid:132) W nazwach baz danych i tabel są rozpoznawane wielkie i małe litery w systemach typu Unix, a w Windows nie. W nazwach kolumn wielkie i małe litery są zawsze ignorowane. (cid:132) Ściśle stosując się do zasad projektowania bazy danych, minimalizujemy liczbę błędów, jakie mogą powstać przy programowaniu interfejsu bazy danych. 96 Rysunek 4.1. Tabele są wyświetlane w porządku alfabetycznym; można z tego skorzystać, nadając związanym tabelom podobne nazwy (cid:132) Technicznie rzecz biorąc, można korzystać z istniejących słów kluczowych w nazwach tabel i kolumn. Jednak w celu odwołania się do nich zawsze należy umieszczać te nazwy we wstecznych apostrofach: SELECT * FROM `table` Jednak najlepiej nie korzystać z istniejących słów kluczowych. Tworzenie bazy danych MySQL Wybór maszyny zapisu Serwer bazy danych MySQL obsługuje kilka różnych typów tabel (typ tabeli określa również typ maszyny zapisu). Choć każdy z typów obsługuje różny zbiór funkcji, sposób ich pracy — mówimy tu o wykonywaniu zapytań — jest właściwie spójny. W tym miejscu krótko omówię trzy główne typy tabel; wraz z postępami poznawania MySQL będziesz mógł zapoznać się ze wszystkimi szczegółami opisanymi w podręczniku. Najważniejszym typem tabel jest MyISAM. Tabele tego typu doskonale nadają się dla większości aplikacji, ponieważ bardzo szybko wykonują operacje SELECT i INSERT. Jednak maszyna zapisu MyISAM nie obsługuje transakcji, o których będzie mowa w rozdziale 10. Kolejnymi popularnymi typami tabel są InnoDB oraz MEMORY (czasami nazywany HEAP). Od wersji 4.0 tabele InnoDB wchodzą w skład domyślnej instalacji MySQL (jeżeli korzystasz z wcześniejszej wersji serwera, musisz włączyć obsługę InnoDB; więcej informacji na ten temat można znaleźć w podręczniku). Tabele InnoDB mogą być wykorzystywane w transakcjach i elegancko obsługują operacje UPDATE. Jednak maszyna InnoDB jest wolniejsza niż MyISAM i wymaga większej ilości miejsca na dysku. Typ tabel MEMORY pozwala na najszybsze wykonywanie operacji, ponieważ takie tabele przechowują dane w pamięci, a nie na dysku. Jest to jednak okupione ograniczeniami, ponieważ tabele MEMORY obsługują tylko kolumny o stałej szerokości, nie można korzystać z atrybutu AUTO_INCREMENT i w czasie awarii traci się wszystkie dane. W y b ó r m a s z y n y z a p i s u 97 Rozdział 4. W celu wybrania maszyny zapisu: 1. Zaloguj się do klienta mysql. Aby wybrać maszynę zapisu, należy najpierw sprawdzić, jakie opcje są dostępne. W tym celu należy odpytać serwer MySQL, do którego podłączył się program mysql (instrukcje specyficzne dla platformy można znaleźć w rozdziale 2., „Uruchamianie MySQL”). 2. Sprawdź, jakie maszyny zapisu są obsługiwane przez dany serwer MySQL, uruchamiając następujące zapytanie (rysunek 4.2): SHOW ENGINES; Wyniki będą inne w różnych instalacjach MySQL. Krok ten warto wykonać, ponieważ nie ma sensu próbować użyć niedostępnej maszyny zapisu. 3. Określ, czy potrzebujesz transakcji. Transakcje są bezpieczniejsze, ponieważ pozwalają wycofać zmiany i chronią dane w przypadku awarii. Jednak tabele nietransakcyjne działają szybciej oraz wymagają mniej pamięci operacyjnej i dyskowej. Jako zasadę należy przyjąć, że jeżeli transakcje są potrzebne, należy skorzystać z InnoDB. Jeżeli nie, najlepiej wybrać MyISAM. u s i p a z y n y z s a m r ó b y W Rysunek 4.2. Lista dostępnych maszyn zapisu w jednej z instalacji MySQL 98 Tworzenie bazy danych MySQL 4. Określ, czy możesz poświęcić wydajność na rzecz trwałości. Jeżeli wybrana tabela musi być obsługiwana naprawdę szybko, to prawdopodobnie najlepszym typem będzie MEMORY. Interakcja z taką tabelą jest naprawdę bardzo szybka, ale w przypadku awarii tracimy wszystkie dane! Wskazówki (cid:132) Ta sama baza danych może zawierać tabele różnych typów. Baza danych do obsługi handlu elektronicznego może korzystać z tabel MyISAM do przechowywania danych klientów i produktów, ale do zamówień może używać tabel InnoDB (w celu wykorzystania transakcji). (cid:132) Dwoma innymi popularnymi typami tabel są MERGE oraz BDB (Berkeley Database). Pierwszy z typów pozwala na traktowanie wielu tabel MyISAM jak jednej. Drugi jest alternatywą dla InnoDB i również obsługuje transakcje. (cid:132) Maszyna zapisu InnoDB została zakupiona przez firmę Oracle, konkurencyjną firmę z rynku baz danych. Oracle kupił również firmę Sleepycat Software, w której powstała maszyna zapisu BDB. Jeszcze nie wiadomo, jak to wpłynie na MySQL, ale możliwe jest, że w przyszłych wersjach obie maszyny znikną. Jest to jeden z powodów, dla którego warto sprawdzać, jakie maszyny zapisu są dostępne, wykonując zapytanie SHOW ENGINES (dostępne od MySQL 4.0). (cid:132) Każda maszyna zapisu posiada inne właściwości, takie jak maksymalna liczba obsługiwanych indeksów, typy kolumn, dla których można zakładać indeksy, maksymalna wielkość tabel (określana jako wielkość na serwerze) itd. Jeżeli rozpoczniesz korzystanie z MySQL na tak wysokim poziomie, konieczne będzie zapoznanie się z podręcznikiem. 99 W y b ó r m a s z y n y z a p i s u (cid:132) Jeżeli będziesz próbował utworzyć tabelę, korzystając z maszyny zapisu niedostępnej w danej wersji MySQL, zostanie zastosowana domyślna maszyna zapisu dla tego serwera. Rozdział 4. Zestawy znaków i sposoby sortowania W czasie tworzenia tabel, oprócz wyboru maszyny zapisu, należy określić zestaw znaków i sposób sortowania. Oba te parametry wpływają na obsługę tekstu przez MySQL. Są to dosyć nowe możliwości, ponieważ wyraźnie zaistniały w wersji MySQL 4.1 (były we wcześniejszych wersjach MySQL, ale nie w tak formalnej postaci). Zestaw znaków określa sposób zapisu liter, cyfr i symboli w kolumnach tekstowych (odnosi się tylko do typów tekstowych). Aby określić zestaw znaków dla określonej kolumny, należy do definicji tej kolumny dodać frazę CHARACTER SET nazwa_zestawu, gdzie nazwa_zestawu określa wybrany zestaw znaków. W celu sprawdzenia dostępnych zestawów znaków można użyć polecenia SHOW CHARACTER SET w kliencie mysql. Domyślnym zestawem znaków jest latin1, który obejmuje język angielski i inne języki zachodnioeuropejskie, ale dostępne są również zestawy dla alfabetów środkowoeuropejskich, greki, cyrylicy, języka chińskiego, koreańskiego i innych. W czasie pisania tej książki MySQL obsługiwał ponad 70 zestawów znaków! Pokrewnym pojęciem jest sposób sortowania, który określa zasady porównywania znaków. Przykładowo sposób sortowania bez rozróżniania wielkości znaków identycznie traktuje małe i wielkie litery. Inny może określać sposób sortowania znaków z ogonkami i kropkami w języku polskim. Każdy zestaw znaków posiada zbiór skojarzonych sposobów sortowania. Dla zestawu znaków latin1 domyślnym sposobem sortowania jest latin1_swedish_ci. Choć może się to wydawać dziwne, jest to doskonałe połączenie do obsługi języka angielskiego i większości języków zachodnich. a i n a w o t r o s y b o s o p s i w ó k a n z y w a t s e Z 100 Tworzenie bazy danych MySQL W celu wybrania zestawu znaków i sortowania: 1. Zaloguj się do klienta mysql. Podobnie jak w przypadku maszyn zapisu, na początek należy sprawdzić, jakie mamy dostępne opcje. W tym celu należy odpytać serwer MySQL, do którego podłączył się program mysql (instrukcje specyficzne dla platformy można znaleźć w rozdziale 2.). 2. Sprawdź, jakie zestawy znaków są obsługiwane przez daną wersję MySQL, uruchamiając zapytanie (rysunek 4.3): SHOW CHARACTER SET; Wyniki będą różniły się w różnych instalacjach MySQL. W mojej instalacji MySQL 5.0.18 w systemie Windows dostępne jest 36 zestawów znaków. Z e s t a w y z n a k ó w i s p o s o b y s o r t o w a n i a Rysunek 4.3.Część listy dostępnych zestawów znaków 101 Wskazówki (cid:132) Zarówno zestaw znaków, jak i sposób sortowania mogą być ustalone na poziomie serwera, bazy danych, tabeli lub kolumny. Jeżeli nie zostanie określony zestaw znaków lub sposób sortowania dla kolumny, zostaną użyte parametry dla tabeli. To samo odnosi się do tabel (które korzystają z wartości domyślnych bazy danych) oraz baz danych (korzystających z ustawień serwera). (cid:132) Można również ustawić zestaw znaków dla sesji interakcyjnej dla połączenia z serwerem MySQL (np. gdy korzystamy z klienta mysql). Informacje na ten temat można znaleźć w podręczniku MySQL. (cid:132) Sposób sortowania można zmienić w zapytaniu. Ma to wpływ na porządkowanie i grupowanie wyników działania tylko tego jednego zapytania. Rozdział 4. 3. Wybierz zestaw znaków do wykorzystania. Zestaw znaków powinien opowiadać językom i typom znaków, jakie mają być zapisywane w bazie danych. Można również wybrać inny zestaw znaków dla każdej kolumny, jeżeli aplikacja wymaga, aby w jednej kolumnie tekst był zapisywany po polsku, a w drugiej po tajsku. 4. Sprawdź, jakie sposoby sortowania są dostępne dla wybranego zestawu znaków przez uruchomienie następującego zapytania (rysunek 4.4): SHOW COLLATION LIKE latin1 Aby znaleźć możliwe sposoby sortowania dla wybranego zestawu znaków, należy uruchomić to zapytanie. Trzeba zmienić latin1 na używany zestaw znaków. 5. Wybierz sposób sortowania. W liście wyświetlanej przez MySQL (rysunek 4.4) należy wyszukać domyślny sposób sortowania oraz sprawdzić, które sposoby są wkompilowane (czyli inaczej mówiąc, obsługiwane). Następnie, jeżeli stwierdzisz, że potrzebujesz innego sposobu niż domyślny, przeczytaj w podręczniku, jak zmienić sposób sortowania i wykonaj odpowiednią operację. a i n a w o t r o s y b o s o p s i w ó k a n z y w a t s e Z Rysunek 4.4. Lista dostępnych sposobów sortowania dla jednego wybranego zestawu znaków 102 Tworzenie bazy danych MySQL Tworzenie baz danych Gdy przejdziemy przez wszystkie kroki projektowania i ostatecznego budowania projektu bazy danych (wymaga to zaskakująco dużo pracy), przyjdzie czas na utworzenie bazy danych w MySQL. W celu wykreowania bazy danych oraz tabel skorzystamy z klienta mysql oraz prostych instrukcji SQL. W rozdziale 2., „Uruchamianie MySQL”, szybko zdefiniowałem dwie bazy danych na potrzeby zademonstrowania, jak dodajemy użytkowników. Składnia polecenia tworzącego nową bazę danych wygląda zatem następująco: CREATE DATABASE nazwa_bazy_danych Aby określić zbiór znaków oraz sposób sortowania dla całej bazy danych, należy na końcu instrukcji CREATE dodać dodatkową klauzulę: CREATE DATABASE nazwa_bazy_danych CHARACTER (cid:170)SET nazwa_zestawu COLLATE (cid:170)nazwa_sposobu_sort W celu zademonstrowania instrukcji CREATE utworzymy teraz bazę danych finanse. Aby utworzyć bazę danych: 1. Zaloguj się do klienta mysql. Jeżeli jeszcze nie wiesz, jak to zrobić, potrzebne wskazówki możesz znaleźć w rozdziale 2., „Uruchamianie MySQL”. Należy się zalogować jako użytkownik mający uprawnienia do tworzenia nowych baz danych. 2. Utwórz i wybierz nową bazę danych (rysunek 4.5). CREATE DATABASE finanse; Jak już wcześniej widzieliśmy, ten jeden wiersz kodu powoduje utworzenie bazy danych (zakładamy, że jesteśmy zalogowani do mysql jako użytkownik z uprawnieniami do tworzenia baz danych). 103 T w o r z e n i e b a z d a n y c h Rysunek 4.5. Tworzenie nowej bazy danych Dodatkowo, choć SQL nie rozróżnia wielkości liter, przyzwyczaiłem się do pisania słów kluczowych SQL wielkimi literami, co pomaga oddzielić je od nazw baz danych, tabel i kolumn. Jeżeli nie chcesz pisać tych słów wielkimi literami, nie jest to obowiązkowe. Rozdział 4. 3. Potwierdź istnienie bazy danych (rysunek 4.6): SHOW DATABASES; Polecenie SHOW, które nie musi być szczegółowo omawiane, wyświetla listę baz danych, do których ma dostęp zalogowany użytkownik. Wskazówki (cid:132) Bazy danych można również tworzyć, korzystając z aplikacji mysqladmin. Za jej pomocą nie można jednak kreować tabel. mysqladmin -u root -p create (cid:170)nazwa_bazy_danych (cid:132) Przy użyciu polecenia SHOW CREATE można zawsze sprawdzić, w jaki sposób została utworzona istniejąca baza danych (rysunek 4.7): SHOW CREATE DATABASE nazwa_bazy_danych h c y n a d z a b e i n e z r o w T Rysunek 4.6. Nowo utworzona baza finanse jest wyświetlana w liście baz danych Rysunek 4.7. Zapytanie SHOW CREATE pokazuje sposób, w jaki została utworzona baza danych lub tabela. Zwróćmy uwagę, że w tym przykładzie wyświetlany jest komentarz dla wersji 4.01.00 (i wyższych) odnoszący się do domyślnego zestawu znaków 104 Tworzenie bazy danych MySQL Tworzenie tabel Gdy mamy już bazę danych, można rozpocząć tworzenie tabel za pomocą polecenia CREATE: CREATE TABLE nazwa_tabeli ( nazwa_kolumny1 opis, nazwa_kolumny2 opis… ) Łatwo zauważyć, że po podaniu nazwy tabeli należy w nawiasie kolejno zdefiniować kolumny. Każda kolumna i opis powinny być oddzielone przecinkiem. Jeżeli chcemy od razu utworzyć indeksy, na końcu instrukcji tworzenia można dodać odpowiednią klauzulę (można również utworzyć indeksy później). CREATE TABLE nazwa_tabeli ( nazwa_kolumny1 opis, nazwa_kolumny2 opis, typ_indeksu(kolumny) ) Jeżeli chcemy nazwać tworzone indeksy, należy zmienić tę część zapytania na: nazwa_indeksu (kolumny) Aby w czasie tworzenia tabeli określić maszynę zapisu, należy na końcu instrukcji tworzącej tabelę dodać klauzulę: CREATE TABLE nazwa_tabeli ( nazwa_kolumny1 opis, nazwa_kolumny2 opis… ) ENGINE = INNODB W wersjach wcześniejszych niż 4.0.18 należało korzystać ze słowa kluczowego TYPE zamiast ENGINE. Jeżeli w czasie tworzenia tabel nie zostanie podana maszyna zapisu, MySQL użyje domyślnego typu tabel (InnoDB w Windows, w innych systemach MyISAM). T w o r z e n i e t a b e l 105 Rozdział 4. Aby określić zestaw znaków lub sposób sortowania dla całej tabeli, należy na końcu zapytania CREATE dodać odpowiednią klauzulę: CREATE TABLE nazwa_tabeli ( nazwa_kolumny1 opis, nazwa_kolumny2 opis… ) ENGINE = MyISAM CHARACTER SET (cid:170)nazwa_zestawu COLLATE nazwa_sposobu_sortowania Teraz utwórzmy cztery tabele składające się na bazę danych finanse. Rysunek 4.8. Pierwszymi wykonanymi operacjami jest zalogowanie się do mysql i wybranie bazy finanse Rysunek 4.9. Klient mysql pozwala na wprowadzanie poleceń zajmujących kilka linii, co sprawia, że dłuższe zapytania SQL są czytelniejsze l e b a t e i n e z r o w T W celu utworzenia tabel: 1. Otwórz klienta mysql i wybierz bazę finanse (rysunek 4.8). USE finanse; Tworzenie tabel będzie łatwiejsze, jeżeli wcześniej zostanie wybrana baza danych. Trzeba zalogować się jako użytkownik z uprawnieniami do tworzenia tabel w tej bazie danych. 2. Utwórz tabelę faktury (rysunek 4.9). CREATE TABLE faktury ( faktura_id SMALLINT(4) UNSIGNED NOT (cid:170)NULL AUTO_INCREMENT, klient_id SMALLINT(3) UNSIGNED NOT NULL, data_faktury TIMESTAMP NOT NULL, wartosc_faktury DECIMAL(10,2) UNSIGNED (cid:170)NOT NULL, opis_faktury TINYTEXT NOT NULL, data_platnosci DATE, PRIMARY KEY (faktura_id), INDEX (klient_id), INDEX (data_faktury), INDEX (wartosc_faktury), INDEX (data_platnosci) ); 106 Rysunek 4.10. MySQL informuje o poprawnym wykonaniu polecenia za pomocą komunikatu Query OK Tworzenie bazy danych MySQL Przedstawione polecenie CREATE wykorzystuje dane dotyczące tabeli faktury, które zostały opracowane we wcześniejszej części rozdziału. Kolejność wprowadzania kolumn determinuje sposób ich rozmieszczenia w tabeli. Po utworzeniu samych kolumn określono również związane z nimi indeksy, dzięki temu będą one istniały natychmiast po utworzeniu tabeli. Z uwagi na fakt, że monitor mysql nie prześle zapytania, zanim nie napotka znaku średnika, wprowadzane polecenie może zajmować kilka linii, podobnie jak ma to miejsce w sytuacji zaprezentowanej na rysunku 4.9. 3. Utwórz tabelę klienci (rysunek 4.10). CREATE TABLE klienci ( klient_id SMALLINT(3) UNSIGNED NOT (cid:170)NULL AUTO_INCREMENT, nazwa_klienta VARCHAR(40) NOT NULL, ulica_klienta VARCHAR(80) NOT NULL, miasto_klienta VARCHAR(30) NOT NULL, stan_klienta VARCHAR(2) NOT NULL, kod_pocztowy_klienta MEDIUMINT(5) (cid:170)UNSIGNED ZEROFILL NOT NULL, telefon_klienta VARCHAR(14), osoba_kontaktowa VARCHAR(40), email_kontaktowy VARCHAR(60), PRIMARY KEY (klient_id), INDEX (nazwa_klienta) ); Tabela ta posiada więcej kolumn, ale tylko dwa indeksy. T w o r z e n i e t a b e l 107 Rozdział 4. 4. Utwórz tabelę wydatki (rysunek 4.11). CREATE TABLE wydatki ( wydatek_id SMALLINT(4) UNSIGNED NOT (cid:170)NULL AUTO_INCREMENT, kategoria_wydatku_id TINYINT(3) (cid:170)UNSIGNED NOT NULL, wartosc_wydatku DECIMAL(10,2) (cid:170)UNSIGNED NOT NULL, opis_wydatku TINYTEXT NOT NULL, data_zaplaty TIMESTAMP NOT NULL, PRIMARY KEY (wydatek_id), INDEX (kategoria_wydatku_id), INDEX (wartosc_wydatku), INDEX (data_zaplaty) ); 5. Na koniec utwórz tabelę wydatki_kategorie (rysunek 4.12). CREATE TABLE wydatki_kategorie ( kategoria_wydatku_id TINYINT(3) (cid:170)UNSIGNED NOT NULL AUTO_INCREMENT, kategoria_wydatku VARCHAR(30) NOT NULL, PRIMARY KEY (kategoria_wydatku_id), UNIQUE (kategoria_wydatku) ); To najprostsza z przedstawionych czterech tabel, ponieważ posiada tylko dwie kolumny i dwa indeksy. l e b a t e i n e z r o w T Rysunek 4.11. Tworzenie trzeciej tabeli Rysunek 4.12. Tworzenie czwartej i ostatniej tabeli 108 Tworzenie bazy danych MySQL 6. Sprawdź, czy tabele zostały utworzone (rysunek 4.13). SHOW TABLES; SHOW COLUMNS FROM faktury; Polecenie SHOW (ang. pokaż) powoduje wyświetlenie tabel bazy danych lub nazw kolumn tabeli i ich typów. Wskazówki (cid:132) Wymieniane w innych publikacjach polecenie DESCRIBE nazwa_tabeli jest tożsame z instrukcją SHOW COLUMNS FROM nazwa_tabeli. (cid:132) Można również wykonać zapytanie SHOW CREATE TABLE nazwa_tabeli, aby sprawdzić, za pomocą jakiego polecenia została utworzona tabela. (cid:132) Jeżeli wykonamy zapytanie SHOW CREATE TABLE nazwa_tabeli po utworzeniu tabeli, możemy zweryfikować sposób, w jaki MySQL implementuje nasze wyrażenie. Operacja ta pozwala sprawdzić, jak MySQL zmienia typy kolumn ze względów wydajnościowych. T w o r z e n i e t a b e l Rysunek 4.13. Gdy chcesz sprawdzić istnienie i strukturę bazy danych, należy posłużyć się poleceniem SHOW. Nie daj się zaskoczyć przez wyniki działania tego polecenia. MySQL posiada własny sposób opisu tabeli, który może różnić się od tego, w jaki sposób została ona utworzona 109 Rozdział 4. Modyfikacja tabel Ostatnim tematem, jaki przedstawimy w tym rozdziale, jest modyfikacja istniejących tabel. Można to wykonywać z dowolnych powodów, ale przed wprowadzeniem zmian należy pomyśleć o wszystkich zasadach normalizacji, indeksach, konwencjach nazewnictwa i tego typu elementach. Bardzo łatwo zaprzepaścić całą pracę włożoną w planowanie przez wprowadzenie do bazy danych „niewielkiej poprawki”. Podstawową instrukcją SQL, służącą do modyfikowania struktury tabel w bazie danych, jest ALTER. Zazwyczaj wiąże się ona z procesem dodawania, usuwania lub przekształcania kolumn, choć pozwala również na zmianę nazwy tabeli oraz zmianę kluczy i indeksów. Umożliwia ona również zmianę nazwy całej tabeli i modyfikowanie indeksów. Podstawową składnią ALTER jest: ALTER TABLE nazwa_tabeli KLAUZULE Ze względu na mnogość dostępnych klauzul zostały one zestawione w tabeli 4.8. Pełna ich lista znajduje się w dodatku B, „Przegląd SQL i MySQL”. l e b a t a j c a k i f y d o M Tabela 4.8. Polecenie SQL ALTER można wykorzystywać do modyfikowania tabeli na wiele sposobów Klauzule ALTER TABLE Klauzula ADD COLUMN Użycie ALTER TABLE nazwa_tabeli ADD COLUMN nazwa_kolumny typ_kolumny ALTER TABLE nazwa_tabeli CHANGE COLUMN nazwa_kolumny nowa_nazwa_kolumny nowy_typ_kolumny ALTER TABLE nazwa_tabeli DROP COLUMN nazwa_kolumny Znaczenie Umieszcza na końcu tabeli nową kolumnę. Pozwala na zmianę typu i właściwości kolumny. Usuwa kolumnę z tabeli wraz z jej danymi. Dodaje nowy indeks dla danej kolumny. Usuwa istniejący indeks. Zmienia nazwę tabeli. CHANGE COLUMN DROP COLUMN ADD INDEX DROP INDEX RENAME AS ALTER TABLE nazwa_tabeli ADD INDEX nazwa_indeksu (nazwa_kolumny) ALTER TABLE nazwa_tabeli DROP INDEX nazwa_indeksu ALTER TABLE nazwa_tabeli RENAME AS nowa_nazwa_tabeli 110 Rysunek 4.14. Do zmiany nazwy lub typu kolumny służy polecenie ALTER TABLE nazwa_kolumny CHANGE COLUMN Tworzenie bazy danych MySQL W celu zademonstrowania zasad posługiwania się poleceniem ALTER pole osoba_kontaktowa tabeli klienci zostanie rozdzielone na dwie kolumny (zgodne z założeniami normalizacji) osoba_kontaktowa_imie i osoba_kontaktowa_nazwisko. W tym przykładzie zakładam, że w tabeli nie ma jeszcze żadnych danych. Jeżeli w tabeli znajdowałyby się dane, trzeba by wziąć to pod uwagę (dodać dwie kolumny, przenieść do nich istniejące dane i skasować kolumnę źródłową). Ponieważ polecenie ALTER powoduje w tabeli znaczne zmiany, powinno się zawsze wykonać kopię tabeli przed rozpoczęciem jej modyfikacji (rozdział 13.). Gdy chcesz zmienić strukturę tabeli: 1. Otwórz klienta mysql i wybierz bazę finanse, o ile wcześniej tego nie zrobiłeś. USE finanse; 2. Zmień nazwę pola osoba_kontaktowa (rysunek 4.14). ALTER TABLE klienci CHANGE COLUMN (cid:170)osoba_kontaktowa osoba_kontaktowa_imie (cid:170)VARCHAR(15); Powyższe polecenie zmienia jedynie nazwę i typ danych kolumny osoba_kontaktowa. Od tej chwili nazwą pola jest osoba_ kontaktowa_imię a typem danych w nim przechowywanych — VARCHAR(15). Wszystkie dane przechowywane w kolumnie pozostały w niej, lecz zostały skrócone do 15 znaków. M o d y f i k a c j a t a b e l Kasowanie tabel i baz danych Aby usunąć tabelę lub bazę danych, należy skorzystać z polecenia DROP. Użycie tego polecenia jest bardzo proste: DROP DATABASE nazwa_bazy_danych; DROP TABLE nazwa_tabeli; Oczywiście, jeżeli skasujemy tabelę, wszystkie zapisane w niej dane zostaną utracone. Gdy skasujemy bazę danych, wszystkie tabele przejdą do historii. 111 Rysunek 4.15. ALTER TABLE nazwa_tabeli ADD COLUMN dodaje nową kolumnę do tabeli Rozdział 4. 3. Utwórz nową kolumnę osoba_kontaktowa_ nazwisko (rysunek 4.15). ALTER TABLE klienci ADD COLUMN (cid:170)osoba_kontaktowa_nazwisko VARCHAR(25) (cid:170)AFTER osoba_kontaktowa_imie; Od tej chwili tabela posiada jeszcze jedną kolumnę, w której nie ma aktualnie żadnych wartości. Dodając kolumnę do tabeli, można skorzystać z klauzuli AFTER nazwa_kolumny, aby wskazać, w którym miejscu tabeli powinna być umieszczona nowa kolumna. 4. Potwierdź wprowadzenie zmian w strukturze tabeli (rysunek 4.16). SHOW COLUMNS FROM klienci; Wskazówki (cid:132) Aby zmienić typ istniejącej tabeli — jest to oczywiście dozwolone — należy skorzystać z następującego polecenia ALTER: ALTER TABLE nazwa_tabeli ENGINE = MYISAM (cid:132) Można również potwierdzić wprowadzenie zmian w strukturze tabeli przez użycie polecenia SHOW CREATE TABLE nazwa_tabeli. Jak zauważymy po uruchomieniu tego zapytania, nie będzie ono pokazywało oryginalnego polecenia CREATE, ale raczej polecenie CREATE, jakie spowoduje utworzenie tabeli w takiej postaci jak obecnie. l e b a t a j c a k i f y d o M Rysunek 4.16. Potwierdzenie zmian w strukturze tabeli przez wykonanie polecenia SHOW COLUMNS 112
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

MySQL. Szybki start. Wydanie II
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: