Top Banner
1 Definicja danych : Do utworzenia tabeli służy instrukcja CREATE TABLE, wymagająca podania nazwy tworzonej tabeli, nazwy każdej kolumny w tej tabeli, typu danych kolumn oraz maksymalnej długości danych w kolumnie. Składnia polecenia: CREATE TABLE nazwa_tabeli ( nazwa_kolumny typ_danych[(długość)opcje], nazwa_kolumny typ_danych[(długość) opcje,] ...) [opcje_tabeli] (nawiasami kwadratowymi obejmujemy elementy opcjonalne).
60

POWTÓRZENIE

Jan 04, 2016

Download

Documents

dawn-puckett

POWTÓRZENIE. Główne elementy składni SQL: Zasady ogólne Podstawowe polecenia definicji danych SQL (tworzenie, usuwanie, modyfikacja) Zbiory znaków i zestawienia w MySQL Połączenie z bazą Kontrola dostępu Typy danych. Definicja danych :. - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: POWTÓRZENIE

1

Definicja danych:

Do utworzenia tabeli służy instrukcja CREATE TABLE, wymagająca podania nazwy tworzonej tabeli, nazwy każdej kolumny w tej tabeli, typu danych kolumn oraz maksymalnej długości danych w kolumnie.

Składnia polecenia:

CREATE TABLE nazwa_tabeli (

nazwa_kolumny typ_danych[(długość)opcje],

nazwa_kolumny typ_danych[(długość) opcje,]

...)

[opcje_tabeli]

(nawiasami kwadratowymi obejmujemy elementy opcjonalne).

Page 2: POWTÓRZENIE

2

W MySQL większość typów danych ma domyślne lub ustalone długości (DATE, TIME, YEAR, ...) lub długości maksymalne (TEXT, BLOB, ...), parametr długości można więc często pominąć.

Opcje, które mogą wystąpić po określeniu typu i długości danych to np. NULL,

NOT NULL,

PRIMARY KEY,

UNIQUE,

DEFAULT wartość_domyślna.

Page 3: POWTÓRZENIE

3

Tworzenie tabeli Biuro:

CREATE TABLE biuro.biuro ( biuroNr VARCHAR(4) NOT NULL, ulica VARCHAR(25) NOT NULL, miasto VARCHAR(25) NOT NULL, kod VARCHAR(6) NOT NULL, PRIMARY KEY (biuroNr))ENGINE = InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;

Page 4: POWTÓRZENIE

4

Opcje definicji kolumn:

Opcje mogące wystąpić w definicji kolumny w instrukcji CREATE TABLE dzielą się na opcje ogólne, które mogą być stosowane do (prawie) wszystkich typów kolumn, i opcje szczególne, stosujące się do niektórych (klas) typów.

Opcje ''szczególne'' muszą być podane w pierwszej kolejności (bezpośrednio po określeniu typu). Oczywiście niektóre z tych opcji wykluczają się wzajemnie, np. PRIMARY KEY i NULL.

Page 5: POWTÓRZENIE

5

PRIMARY KEY

określa daną kolumnę jako klucz główny tabeli. Tabela może posiadać tylko (co najwyżej) jeden klucz główny, o wartościach nie powtarzających się i różnych od NULL.

Klucz główny w tabeli może być tylko jeden, ale może obejmować więcej niż jedną kolumnę. Wówczas cały zestaw wartości z odpowiednich kolumn traktowany jest jako wartość klucza głównego.

Opcje dotyczące wszystkich typów:

Page 6: POWTÓRZENIE

6

DEFAULT wartość_domyślna

określa wartość domyślną kolumny dla nowo wprowadzanych wierszy w przypadku, gdy instrukcja tworząca nowy wiersz nie zadaje tej wartości. Jeśli w definicji kolumny pominięto opcję DEFAULT (oraz nie podano opcji NOT NULL), to w takich wypadkach wartością domyślną jest NULL. Jeżeli natomiat kolumna bez opcji DEFAULT została zadeklarowana jako NOT NULL, to w miejsce brakującej wartości zostanie automatycznie wprowadzona przez MySQL wartość domyślna zależna od typu.

Page 7: POWTÓRZENIE

7

NOT NULL | NULL

określa, czy NULL jest dopuszczalną wartością w tej kolumnie. Domyślnie wartość NULL jest dopuszczalna, za wyjątkiem kluczy (kolumn indeksowanych).

AUTO_INCREMENT

opcja ta ma sens dla kolumn o numerycznych typach wartości. Oznacza ona, że jeżeli przy tworzeniu wiersza nie zada się jawnie wartości dla tej kolumny (lub zostanie podana wartość NULL bądź zero), to wartością zapisaną będzie największa z wcześniej występujących w tej kolumnie powiększona o jeden.

Page 8: POWTÓRZENIE

8

Opcje dotyczące niektórych typów:

UNSIGNED: opcja ta stosuje się do typów numerycznych i oznacza, że dopuszczone są wyłącznie wartości nieujemne. Zastosowanie jej zwiększa również zakres dopuszczalnych wartości (dodatnich) w sposób zależny od konkretnego typu numerycznego.

ZEROFILL: stosuje się do typów opisujących liczby całkowite. Powoduje dopełnienie pola danych zerami do jego maksymalnej długości.

BINARY: stosuje się do typów CHAR i VARCHAR. W MySQL sortowanie i porównywanie wartości znakowych odbywa się domyślnie z utożsamieniem małych i wielkich liter (zgodnie z kodowaniem ISO-8859-1). Opcja BINARY wyłącza to utożsamienie dla danej kolumny.

Page 9: POWTÓRZENIE

9

Deklaracje dodatkowe do definicji tabeli:

W ciągu definicji kolumn w instrukcji CREATE TABLE mogą być ponadto umieszczone dodatkowe deklaracje, służące głównie do deklarowania indeksów, w tym kluczy złożonych (indeksów obejmujących więcej niż jedną kolumnę).

[CONSTRAINT [symbol]] PRIMARY KEY (nazwa_kolumny [(dłudość)] [ASC | DESC],...)

Page 10: POWTÓRZENIE

10

{INDEX|KEY} [nazwa_indeksu] (nazwa_kolumny_indeksowej [(dłudość)] , ..)

deklaruje indeksowanie ze względu na wartości z odpowiednich kolumn. Indeks może być nazwany (zgodnie z wcześniej omówionymi regułami tworzenia nazw). Wartości klucza indeksowania nie mogą być NULL.

W MySQL istnieje możliwość zadeklarowania długości klucza indeksowania, w postaci kolumna(długość), mniejszej niż długość pola danych odpowiedniej kolumny. Wówczas do tworzenia indeksu wykorzystana jest jedynie część pola danych, co owocuje czasami o wiele mniejszymi (w sensie zużycia miejsca na dysku) i szybciej przeszukiwanymi indeksami.

Page 11: POWTÓRZENIE

11

[CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [nazwa_indeksu] (nazwa_kolumny_indeksowej,...)

deklaruje indeks o nie powtarzających się wartościach.

Kolumna typu BLOB nie może być indeksowana.

Page 12: POWTÓRZENIE

12

Realizacja kluczy obcych w MySQL:

[CONSTRAINT [symbol]] FOREIGN KEY [nazwa_indeksu] (nazwa_kolumny_indeksowej,...)

REFERENCES nazwa_tabeli [(nazwa_kolumny_indeksowej,...)] [ON DELETE reference_option] [ON UPDATE reference_option]

reference_option:

RESTRICT | CASCADE | SET NULL | NO ACTION

RESTRICT oznacza że usuwana tabela, kolumna, perspektywa nie może być w danej chwili używana przez jakikolwiek obiekt w bazie.

Page 13: POWTÓRZENIE

13

Dodanie indeksu do istniejącej tabeli:

CREATE [UNIQUE] INDEX nazwa_indeksuON nazwa_tabeli (nazwa_kolumny[(length)] [ASC | DESC],...)[USING {BTREE | HASH | RTREE}] 

Usuwanie indeksu:

DROP INDEX nazwa_indeksu ON nazwa_tabeli

Indeks przyspiesza operacje dostępu do danych w posortowanych według kolumn indeksowanych oraz wyszukiwania wierszy, zawierających dane z indeksowanych kolumn.

Natomiast spowalnia wstawianie, usuwanie i zmiany wartości w indeksowanych kolumnach, ponieważ jego zawartość musi ulec zmianie w momencie zmiany zawartości tabeli.

Page 14: POWTÓRZENIE

14

Indeksy zajmują też miejsce na dysku:

Page 15: POWTÓRZENIE

15

Wyświetlanie zapisu tworzenia tabeli:

mysql> show create table biuro\G************************** 1. row ************************** Table: biuroCreate Table: CREATE TABLE `biuro` ( `biuroNr` varchar(4) NOT NULL, `ulica` varchar(25) NOT NULL, `miasto` varchar(25) NOT NULL, `kod` varchar(6) NOT NULL, PRIMARY KEY (`biuroNr`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE= utf8 _polish_ci1 row in set (0.00 sec)mysql>

Page 16: POWTÓRZENIE

16

Prezentacja struktury tabeli:

mysql> DESCRIBE biuro;+---------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+---------+-------------+------+-----+---------+-------+| biuroNr | varchar(4) | NO | PRI | NULL | || ulica | varchar(25) | NO | | NULL | || miasto | varchar(25) | NO | | NULL | || kod | varchar(6) | NO | | NULL | |+---------+-------------+------+-----+---------+-------+4 rows in set (0.01 sec)mysql>

Polecenie równoważne:

SHOW COLUMNS FROM biuro;

Page 17: POWTÓRZENIE

17

Rozszerzona prezentacja struktury tabeli:

mysql> SHOW FULL COLUMNS FROM biuro\G*************************** 1. row *************************** Field: biuroNr Type: varchar(4) Collation: utf8_polish_ci Null: NO Key: PRI Default: NULL Extra:Privileges: select,insert,update,references Comment:*************************** 2. row *************************** Field: ulica Type: varchar(25) Collation: utf8_polish_ci Null: NO Key: Default: NULL Extra:Privileges: select,insert,update,references Comment:

Page 18: POWTÓRZENIE

18

*************************** 3. row *************************** Field: miasto Type: varchar(25) Collation: utf8_polish_ci Null: NO Key: Default: NULL Extra:Privileges: select,insert,update,references Comment:*************************** 4. row *************************** Field: kod Type: varchar(6) Collation: utf8_polish_ci Null: NO Key: Default: NULL Extra:Privileges: select,insert,update,references Comment:

Page 19: POWTÓRZENIE

19

Wyświetlanie indeksów tabeli:

mysql> SHOW INDEX FROM biuro\G************************** 1. row ************************** Table: biuro Non_unique: 0 Key_name: PRIMARYSeq_in_index: 1 Column_name: biuroNr Collation: A Cardinality: 7 Sub_part: NULL Packed: NULL Null: Index_type: BTREE Comment:1 row in set (0.00 sec)

Page 20: POWTÓRZENIE

20

Modyfikacja struktury tabel:

Strukturę tabel już istniejących (i wypełnionych danymi) można modyfikować, w sensie dodawania lub usuwania kolumn i indeksów, zmiany definicji kolumn, czy wreszcie zmiany nazwy tabeli instrukcją w postaci:

ALTER [IGNORE] TABLE nazwa_tabeli operacja1[, operacja2, ...]

gdzie możliwe operacje modyfikujące to:

ADD [COLUMN] definicja_kolumny [FIRST|AFTER nazwa_kolumny]:

stworzenie nowej kolumny, według definicji o składni analogicznej jak w instrukcji CREATE TABLE - domyślnie kolumna umieszczana jest jako ostatnia (opcje pozwalają zażądać, by nowa kolumna została stworzona w określonej pozycji - rozszerzenie MySQL).

Page 21: POWTÓRZENIE

21

ADD [CONSTRAINT [symbol]] PRIMARY KEY (nazwa_kolumny_indeksowej[(długość)] [ASC | DESC],...) [index_type]

ADD {INDEX|KEY} [nazwa_indeksu] [index_type] (nazwa_kolumny_indeksowej[(długość)] [ASC | DESC], ...)

ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [nazwa_indeksu] [index_type] (nazwa_kolumny_indeksowej[(długość)] [ASC | DESC],...)

Page 22: POWTÓRZENIE

22

ADD [CONSTRAINT [symbol]] FOREIGN KEY [nazwa_indeksu] (nazwa_kolumny_indeksowej,...) REFERENCES nazwa_tabeli [(nazwa_kolumny_indeksowej,...)] [ON DELETE reference_option] [ON UPDATE reference_option]

reference_option:

RESTRICT | CASCADE | SET NULL | NO ACTION

Page 23: POWTÓRZENIE

23

ALTER [COLUMN] nazwa_kolumny { SET DEFAULT wartość | DROP DEFAULT } – zmiana (lub usunięcie) wartości domyślnej z definicji istniejącej kolumny.

CHANGE [COLUMN] stara_nazwa_kolumny nowa_nazwa_kolumny definicja_kolumny [FIRST|AFTER nazwa_kolumny] – umożliwia zmianę definicji istniejącej kolumny (nazwy) - (rozszerzenie MySQL).

MODIFY [COLUMN] nazwa_kolumny definicja_kolumny [FIRST|AFTER nazwa_kolumny] – umożliwia zmianę definicji istniejącej kolumny (właściwości).

Page 24: POWTÓRZENIE

24

DROP [COLUMN] nazwa_kolumny – usuwa kolumnę (i zapisane w niej dane), ewentualnie modyfikując (lub usuwając) indeksy dla których kluczem lub częścią klucza była usunięta kolumna.

DROP PRIMARY KEY – usuwa klucz główny (jako klucz indeksowania, nie jako kolumnę), lub, w przypadku braku klucza głównego w tabeli, pierwszy w kolejności indeks typu UNIQUE.

DROP {INDEX|KEY} nazwa_indeksu - usuwa indeks

DROP FOREIGN KEY nazwa – usuwa klucz obcy

Page 25: POWTÓRZENIE

25

RENAME [TO] nowa_nazwa_tabeli – zmiana nazwy tabeli.

CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]

[DEFAULT] CHARACTER SET charset_name [COLLATE collation_name]

Page 26: POWTÓRZENIE

26

Opcjonalne słowo COLUMN w niektórych instrukcjach może być dodawane dla czytelności programu, nie ma ono wpływu na znaczenie instrukcji.

Opcja IGNORE (rozszerzenie MySQL) dotyczy sytuacji, gdy modyfikacja struktury tabeli doprowadziła do powtarzania się wartości kluczy UNIQUE (w tym klucz głównego). Bez opcji IGNORE operacja taka zwraca błąd (modyfikacje zostają cofnięte), przy jej zastosowaniu w tabeli zmodyfikowanej zostanie zapisany tylko jeden (pierwszy w kolei) spośród wierszy odpowiadających powtórzonym wartościom klucza.

Page 27: POWTÓRZENIE

27

Usuwanie tabel:

Niepotrzebne już tabele można usunąć za pomocą instrukcji

DROP TABLE tabela1, ...

co powoduje trwałe usunięcie zarówno danych zapisanych w tabelach podanych jako argumenty, jak i ich definicji.

Używać ostrożnie

Zmiana nazwy tabeli bezpośrednio:

RENAME TABLE stara_nazwa_tabeli TO nowa_nazwa_tabeli [, stara_nazwa_tabeli2 TO nowa_nazwa_tabeli2] ...

- jednej lub więcej.

Page 28: POWTÓRZENIE

28

Wprowadzanie danych instrukcją INSERT :

W najprostszej postaci instrukcja INSERT służy wprowadzeniu do tabeli pojedynczego wiersza danych:

INSERT [IGNORE] [INTO] nazwa_tabeli [ (kolumna1, ...) ]

VALUES (wyrażenie1, ...), (wyrażenie12,...),...

Jeżeli nazwy kolumn, do których wstawiamy wartości podanych wyrażeń nie zostaną podane jawnie, to wartości te zostaną wpisane do kolejnych kolumn w takim porządku, w jakim kolumny te były zdefiniowane instrukcją CREATE TABLE.

Pola danych w tych kolumnach, dla których nie podano wartości otrzymają wartości domyślne (zdefiniowane jawnie w instrukcji CREATE TABLE lub automatyczne, np. napis pusty dla pól napisowych).

Page 29: POWTÓRZENIE

29

Szczególne zachowanie dotyczy kolumn zadeklarowanych jako AUTO_INCREMENT oraz typu TIMESTAMP (w tym ostatnim przypadku pole kolumny otrzyma wartość odpowiadającą czasowi operacji, o ile nie podamy jawnie innej wartości - innej niż NULL).

Druga postać instrukcji INSERT pozwala skopiować do tabeli wiersze wybrane z innych tabel:

INSERT INTO tabela [ (kolumna1, ...) ] SELECT ...

Page 30: POWTÓRZENIE

30

mysql> INSERT INTO biuro (biuroNr,ulica,miasto,kod) VALUES ('B001','Piękna 46','Białystok','15-900');Query OK, 1 row affected (0.06 sec) mysql> SELECT * FROM biuro;+---------+-----------+-----------+--------+| biuroNr | ulica | miasto | kod |+---------+-----------+-----------+--------+| B001 | Piękna 46 | Białystok | 15-900 |+---------+-----------+-----------+--------+1 row in set (0.00 sec)

Page 31: POWTÓRZENIE

31

mysql> INSERT INTO biuro VALUES ('B002','Cicha 56', 'Łomża','18-400');Query OK, 1 row affected (0.05 sec) mysql> SELECT * FROM biuro;+---------+-----------+-----------+--------+| biuroNr | ulica | miasto | kod |+---------+-----------+-----------+--------+| B001 | Piękna 46 | Białystok | 15-900 || B002 | Cicha 56 | Łomża | 18-400 |+---------+-----------+-----------+--------+2 rows in set (0.00 sec)

Page 32: POWTÓRZENIE

32

Usuwanie wierszy instrukcją DELETE:

Do usuwania wiersza bądź wierszy z tabeli służy instrukcja DELETE. Specyfikacji wierszy, które mają być usunięte służy klauzula WHERE:

DELETE FROM nazwa_tabeli [WHERE warunki]

Bez klauzuli WHERE operacja powoduje usunięcie wszystkich wierszy z tabeli.

Jeżeli chcemy mieć pewność, że usunięty zostanie tylko jeden określony wiersz, to warunek powinien dotyczyć wartości klucza głównego (lub jakiegoś klucza zadeklarowanego jako UNIQUE).

Page 33: POWTÓRZENIE

33

mysql> DELETE FROM biuro WHERE biuroNr='B002'; SELECT * FROM biuro;Query OK, 1 row affected (0.03 sec)+---------+------------+------------+--------+| biuroNr | ulica | miasto | kod |+---------+------------+------------+--------+| B001 | Piękna 46 | Białystok | 15-900 |+---------+------------+------------+--------+1 row in set (0.00 sec)

Usunięcie biura o numerze B002:

mysql> DELETE FROM biuro; SELECT * FROM biuroQuery OK, 1 row affected (0.03 sec)

Empty set (0.00 sec)

Usunięcie wszystkich biur:

Page 34: POWTÓRZENIE

34

Wprowadzanie poleceń z pliku :

Plik z odpowiednimi poleceniami zapisujemy w katalogu bin naszego MySQL'a np. pod nazwą biuro.sql.

Uruchamiamy komendą:

SOURCE biuro.sql

Jeżeli plik zapisaliśmy w innym miejscu niż katalog bin np. na pulpicie komenda wtedy wygląda np. tak:

SOURCE c:\windows\pulpit\biuro.sql

Page 35: POWTÓRZENIE

35

Przykładowa zawartość:

CREATE DATABASE IF NOT EXISTS Biuro DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_polish_ci;

CONNECT biuro;

CREATE TABLE IF NOT EXISTs biuro (biuroNr varchar(4) NOT NULL,ulica varchar(25) NOT NULL,miasto varchar(25) NOT NULL,kod varchar(6) NOT NULL,PRIMARY KEY (biuroNr) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;

INSERT INTO biuro (biuroNr,ulica,miasto,kod) VALUES ('B001','Piękna 46','Białystok','15-900');

INSERT INTO biuro VALUES ('B002','Cicha 56',‘Łomża', '18-400');

Page 36: POWTÓRZENIE

36

mysql> source biuro.sqlQuery OK, 1 row affected (0.02 sec)

Connection id: 1Current database: biuro

Query OK, 0 rows affected (0.06 sec)

Query OK, 1 row affected (0.03 sec)

Query OK, 1 row affected (0.02 sec)

mysql>

Page 37: POWTÓRZENIE

37

mysql> SELECT * FROM biuro;+---------+-----------+-----------+--------+| biuroNr | ulica | miasto | kod |+---------+-----------+-----------+--------+| B001 | Piękna 46 | Białystok | 15-900 || B002 | Cicha 56 | Łomża | 18-400 |+---------+-----------+-----------+--------+2 rows in set (0.00 sec)

Wyświetlenie zawartości tabeli:

Page 38: POWTÓRZENIE

38

mysql> INSERT INTO biuro VALUES ('B003','Mała 63','Białystok','15-900'),('B004','Miodowa 32','Grajewo','19-300'),('B005','Dobra 22',‘Łomża','18-400'),('B006','Słoneczna 55','Białystok','15-900'),('B007','Akacjowa 16','Augustów','16-300');

Query OK, 1 row affected (0.05 sec) mysql> SELECT * FROM biuro;+---------+---------------+------------+--------+| biuroNr | ulica | miasto | kod |+---------+---------------+------------+--------+| B001 | Piękna 46 | Białystok | 15-900 || B002 | Cicha 56 | Łomża | 18-400 || B003 | Mała 63 | Białystok | 15-900 || B004 | Miodowa 32 | Grajewo | 19-300 || B005 | Dobra 22 | Łomża | 18-400 || B006 | Słoneczna 55 | Białystok | 15-900 || B007 | Akacjowa 16 | Augustów | 16-300 |+---------+---------------+------------+--------+7 rows in set (0.00 sec)

Page 39: POWTÓRZENIE

39

Page 40: POWTÓRZENIE

40

UPDATE [IGNORE] nazwa_tabeli SET kolumna1=wartość1 [, kolumna2=wartość2, ...]

[WHERE warunek_selekcji]

[LIMIT liczba_wierszy];

bez klauzuli WHERE wszystkie wiersze kolumny będą tak samo zmodyfikowane

Modyfikowanie danych:

Page 41: POWTÓRZENIE

41

mysql> UPDATE biuro SET kod=’19-200’ WHERE miasto=‘Grajewo';Query OK, 1 row affected (0.05 sec)Rows matched: 1 Changed: 1 Warnings: 0 mysql> SELECT * FROM biuro;+---------+---------------+------------+--------+| biuroNr | ulica | miasto | kod |+---------+---------------+------------+--------+| B001 | Piękna 46 | Białystok | 15-900 || B002 | Cicha 56 | Łomża | 18-400 || B003 | Mała 63 | Białystok | 15-900 || B004 | Miodowa 32 | Grajewo | 19-200 || B005 | Dobra 22 | Łomża | 18-400 || B006 | Słoneczna 55 | Białystok | 15-900 || B007 | Akacjowa 16 | Augustów | 16-300 |+---------+---------------+------------+--------+7 rows in set (0.00 sec)

Page 42: POWTÓRZENIE

42

mysql> UPDATE biuro SET miasto=UPPER

 mysql> SELECT * FROM biuro;+---------+---------------+------------+--------+| biuroNr | ulica | miasto | kod |+---------+---------------+------------+--------+| B001 | Piękna 46 | Białystok | 15-900 || B002 | Cicha 56 | Łomża | 18-400 || B003 | Mała 63 | Białystok | 15-900 || B004 | Miodowa 32 | Grajewo | 19-200 || B005 | Dobra 22 | Łomża | 18-400 || B006 | Słoneczna 55 | Białystok | 15-900 || B007 | Akacjowa 16 | Augustów | 16-300 |+---------+---------------+------------+--------+7 rows in set (0.00 sec)

Page 43: POWTÓRZENIE

43

mysql> CREATE TABLE IF NOT EXISTS personel ( -> personelNr varchar(4) NOT NULL, -> imie varchar(25) NOT NULL, -> nazwisko varchar(25) NOT NULL, -> stanowisko varchar(25) NOT NULL, -> plec enum('K','M') NOT NULL, -> dataUr date NOT NULL, -> pensja smallint(4) unsigned NOT NULL, -> biuroNr varchar(4) NOT NULL, -> PRIMARY KEY (personelNr), -> KEY biuroNr (biuroNr), -> CONSTRAINT biuroNr FOREIGN KEY (biuroNr) REFERENCES biuro (biuroNr) ON UPDATE CASCADE ON DELETE CASCADE -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;Query OK, 0 rows affected (0.08 sec)

Tworzymy drugą powiązaną kluczem obcym tabelę:

KEY `biuroNr` (`biuroNr`) – indeksy do kluczy obcych są tworzone w MySQL automatycznie

Page 44: POWTÓRZENIE

44

Wyświetlanie zapisu tworzenia tabeli:

mysql> SHOW CREATE TABLE personel\G************************** 1. row ************************** Table: personelCreate Table: CREATE TABLE `personel` ( `personelNr` varchar(4) COLLATE utf8_polish_ci NOT NULL, `imie` varchar(25) COLLATE utf8_polish_ci NOT NULL, `nazwisko` varchar(25) COLLATE utf8_polish_ci NOT NULL, `stanowisko` varchar(25) COLLATE utf8_polish_ci NOT NULL, `plec` enum('K','M') COLLATE utf8_polish_ci NOT NULL, `dataUr` date NOT NULL, `pensja` smallint(4) unsigned NOT NULL, `biuroNr` varchar(4) COLLATE utf8_polish_ci NOT NULL, PRIMARY KEY (`personelNr`), KEY `biuroNr` (`biuroNr`), CONSTRAINT `biuroNr` FOREIGN KEY (`biuroNr`) REFERENCES

`biuro` (`biuroNr`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci1 row in set (0.02 sec)

Page 45: POWTÓRZENIE

45

Prezentacja struktury tabeli:

mysql> DESCRIBE personel;+------------+----------------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+------------+----------------------+------+-----+---------+-------+| numer | varchar(4) | NO | PRI | NULL | || imie | varchar(25) | NO | | NULL | || nazwisko | varchar(25) | NO | | NULL | || stanowisko | varchar(25) | NO | | NULL | || plec | enum('K','M') | NO | | NULL | || dataUr | date | NO | | NULL | || pensja | smallint(4) unsigned | NO | | NULL | || biuroNr | varchar(4) | NO | MUL | NULL | |+------------+----------------------+------+-----+---------+-------+8 rows in set (0.02 sec)

Polecenie równoważne:

SHOW COLUMNS FROM personel;

Page 46: POWTÓRZENIE

46

Rozszerzona prezentacja struktury tabeli:

mysql> SHOW FULL COLUMNS FROM personel\G*************************** 1. row *************************** Field: personelNr Type: varchar(4) Collation: utf8_polish_ci Null: NO Key: PRI Default: NULL Extra:Privileges: select,insert,update,references Comment:*************************** 2. row *************************** Field: imie Type: varchar(25) Collation: utf8_polish_ci Null: NO Key: Default: NULL Extra:Privileges: select,insert,update,references Comment:

Page 47: POWTÓRZENIE

47

*************************** 3. row *************************** Field: nazwisko Type: varchar(25) Collation: utf8_polish_ci Null: NO Key: Default: NULL Extra:Privileges: select,insert,update,references Comment:*************************** 4. row *************************** Field: stanowisko Type: varchar(25) Collation: utf8_polish_ci Null: NO Key: Default: NULL Extra:Privileges: select,insert,update,references Comment:

Page 48: POWTÓRZENIE

48

*************************** 5. row *************************** Field: plec Type: enum('K','M') Collation: utf8_polish_ci Null: NO Key: Default: NULL Extra:Privileges: select,insert,update,references Comment:*************************** 6. row *************************** Field: dataUr Type: date Collation: NULL Null: NO Key: Default: NULL Extra:Privileges: select,insert,update,references Comment:

Page 49: POWTÓRZENIE

49

*************************** 7. row *************************** Field: pensja Type: smallint(4) unsigned Collation: NULL Null: NO Key: Default: NULL Extra:Privileges: select,insert,update,references Comment:*************************** 8. row *************************** Field: biuroNr Type: varchar(4) Collation: utf8_polish_ci Null: NO Key: MUL Default: NULL Extra:Privileges: select,insert,update,references Comment:8 rows in set (0.02 sec)

Page 50: POWTÓRZENIE

50

Wyświetlanie indeksów tabeli personel:mysql> SHOW INDEX FROM personel\G************************** 1. row ************************** Table: personel Non_unique: 0 Key_name: PRIMARYSeq_in_index: 1 Column_name: personelNr Collation: A Cardinality: 0 Sub_part: NULL Packed: NULL Null: Index_type: BTREE Comment:************************** 2. row ************************** Table: personel Non_unique: 1 Key_name: biuroNrSeq_in_index: 1 Column_name: biuroNr Collation: A Cardinality: 0 Sub_part: NULL Packed: NULL Null: Index_type: BTREE Comment:2 rows in set (0.02 sec)

Page 51: POWTÓRZENIE

51

Powiązania kluczy obcych:

Page 52: POWTÓRZENIE

52

Wprowadzanie danych z pliku w MySQL:

Często mamy do czynienia z taką sytuacją, że posiadamy już dane które chcemy wprowadzić do bazy danych, zapisane w pliku lub plikach tekstowych postaci ,,rekord-pola''.

Plik, z którego chcemy wprowadzić dane do tabeli MySQL musi się znajdować na dysku widzianym jako lokalny przez serwer bazy danych.

Najlepiej, jeżeli wierszom tabeli odpowiadają rekordy pliku (domyślnie: linijki tekstu), a wartościom w kolumnach - pola rekordów (w ustalonej kolejności).

Page 53: POWTÓRZENIE

53

LOAD DATA INFILE 'plik' [ REPLACE | IGNORE ] INTO TABLE nazwa_tabeli [CHARACTER SET charset_name][ FIELDS [ TERMINATED BY '\t']

[ [OPTIONALLY] ENCLOSED BY ''] [ESCAPED BY '\\']]

[ LINES [STARTING BY ''] [TERMINATED BY '\n']]

[ IGNORE number LINES ] [(pole1, pole2,...)]

Domyślnie separatorem pól jest znak tabulacji (\t), a każdy rekord zakończony jest znakiem nowej linii (\n).

Page 54: POWTÓRZENIE

54

STARTING BY – od jakich znaków zaczyna się linia w naszym pliku (ignorujemy niektóre znaki na początku linii);

IGNORE number LINES – ignorujemy kilka początkowych linii np. nagłówka;

Opcje REPLACE i IGNORE dotyczą sposobu potraktowania rekordów z pliku, których wprowadzenie spowodowałoby duplikację wartości kluczy UNIQUE (w tym klucza głównego).

Przy opcji REPLACE nowo wczytany rekord zastępuje wiersze o kolidujących wartościach kluczy, przy IGNORE - rekord taki zostanie zignorowany (pominięty).

Page 55: POWTÓRZENIE

55

W wypadku, gdy nie podano żadnej z tych opcji, kolizja wartości klucza wywoła błąd i spowoduje przerwanie wczytywania danych.

Podanie nazw pól służy przyporządkowaniu kolejnych pól rekordów kolumnom tabeli.

Zazwyczaj można pominąć wszystkie opcje dotyczące separatorów pól i rekordów, jeżeli plik wejściowy został właściwie przygotowany.

Page 56: POWTÓRZENIE

56

Np. dla pliku zlokalizowanego C:\MySQL5\data\biuro\personel.txt o zawartości:

SA8 Katarzyna Morawska kierownik K 1971-5-6 1700 B007SA9 Maria Hojna asystent K 1970-2-19 900 B007SB20 Sabina Bober dyrektor K 1940-6-3 2400 B003SB21 Daniel Frankowski kierownik M 1958-3-24 1800 B003SB22 Małgorzata Kowalska asystent K 1972-3-15 1000 B003SB23 Anna Biały asystent K 1960-11-10 1200 B003SB30 Katarzyna Michalska dyrektor K 1960-11-17 2500 B006SB31 Dawid Piotrowski asystent M 1975-3-22 1100 B006SB32 Małgorzata Plichta asystent K 1971-10-3 1200 B006SG20 Karolina Mucha dyrektor K 1953-3-3 2200 B004SG21 Piotr Cybulski asystent M 1974-12-6 1300 B004SL20 Paweł Nowak kierownik M 1962-2-2 1500 B002SL21 Paweł Kowalski asystent M 1969-5-5 1000 B002SL22 Monika Munk asystent K 1977-7-26 1100 B002SL30 Jan Wiśniewski dyrektor M 1945-10-1 3000 B005SL31 Julia Lisicka asystent K 1965-7-13 900 B005SL32 Michał Brzęczyk asystent M 1959-3-15 1000 B005

Page 57: POWTÓRZENIE

57

zapiszemy:

mysql>LOAD DATA INFILE ‘personel.txt' INTO TABLE personel;

lub w innej lokalizacji:

mysql>LOAD DATA INFILE 'C:/MySQL5/bin/personel.txt‘ INTO TABLE personel;

W MySQL jako znaku separacji w ścieżce dostępu używamy '/' lub '\\'

mysql>LOAD DATA INFILE 'C:\\MySQL5\\bin\\ personel.txt' INTO TABLE personel;

Page 58: POWTÓRZENIE

58

Wyprowadzanie wyników zapytania do pliku:

Istnieje też możliwość zapisania tabeli wynikowej instrukcji SELECT do pliku tekstowego, który później można wykorzystać w instrukcji LOAD DATA INFILE

SELECT ... INTO OUTFILE 'nazwa_pliku' [FIELDS [TERMINATED BY '\t'] [ESCAPED BY '\\']] [LINES [TERMINATED BY '\n']] FROM nazwa_tabeli

Podobnie jak w LOAD DATA INFILE opcje dotyczące formatu pliku są zbyteczne, jeśli akceptujemy wartości domyślne (linijka=rekord, pola przedzielone kodem tabulacji).

Podanie nazwy już istniejącego pliku spowoduje błąd. Zaleca się podawanie nazwy pliku wynikowego w postaci pełnej ścieżki.

Page 59: POWTÓRZENIE

59

np. dla tabeli biuro o zawartości:

mysql> SELECT * FROM biuro;+---------+---------------+------------+--------+| biuroNr | ulica | miasto | kod |+---------+---------------+------------+--------+| B001 | Piękna 46 | Białystok | 15-900 || B002 | Cicha 56 | Łomża | 18-400 || B003 | Mała 63 | Białystok | 15-900 || B004 | Miodowa 32 | Grajewo | 19-200 || B005 | Dobra 22 | Łomża | 18-400 || B006 | Słoneczna 55 | Białystok | 15-900 || B007 | Akacjowa 16 | Augustów | 16-300 |+---------+---------------+------------+--------+

Page 60: POWTÓRZENIE

60

mysql> SELECT * INTO OUTFILE 'C:/tmp/biuro.txt' FROM biuro;

Polecenie:

spowoduje utworzenie pliku biuro.txt o zawartości:

B001 Piękna 46 Białystok 15-900B002 Cicha 56 Łomża 18-400B003 Mała 63 Białystok 15-900B004 Miodowa 32 Grajewo 19-200B005 Dobra 22 Łomża 18-400B006 Słoneczna 55 Białystok 15-900B007 Akacjowa 16 Augustów 16-300