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].
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.
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;
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). Niektóre z tych opcji mogą wykluczać się wzajemnie, np. PRIMARY KEY i NULL.
5 PRIMARY KEY (nazwa_kolumny [(długość)] [ASC | DESC],...) 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:
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.
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, ż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.
Opcje dotyczące niektórych typów: 8 UNSIGNED : 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) zależnie od konkretnego typu numerycznego. ZEROFILL : 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 ). Opcja BINARY wyłącza to utożsamienie dla danej kolumny.
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ę). {INDEX|KEY} [nazwa_indeksu] (nazwa_kolumny_indeksowej [(długość)],..) 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.
10 W MySQL istnieje możliwość zadeklarowania długości klucza indeksowania, w postaci kolumna(długość), mniejszej niż długość pola danych odpowiedniej kolumny, do tworzenia indeksu wykorzystana jest jedynie część pola danych, co owocuje czasami o wiele mniejszymi i szybciej przeszukiwanymi indeksami. [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.
Realizacja kluczy obcych w MySQL: 11 [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.
12 Dodanie indeksu do istniejącej tabeli: CREATE [UNIQUE] INDEX nazwa_indeksu ON 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.
13 Indeksy zajmują też miejsce na dysku:
14 Wyświetlanie zapisu tworzenia tabeli: mysql> show create table biuro\G ************************** 1. row ************************** Table: biuro Create 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_ci 1 row in set (0.00 sec) mysql>
15 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 | | rows in set (0.01 sec) mysql> Polecenie równoważne: SHOW COLUMNS FROM biuro;
16 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:
17 *************************** 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:
18 Wyświetlanie indeksów tabeli: mysql> SHOW INDEX FROM biuro\G ************************** 1. row ************************** Table: biuro Non_unique: 0 Key_name: PRIMARY Seq_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)
19 Modyfikacja struktury tabel: Modyfikowanie struktur tabel już istniejących (i wypełnionych danymi) w sensie: - dodawania, usuwania kolumn, indeksów, - zmiany definicji kolumn, - zmiany nazwy tabeli ALTER [IGNORE] TABLE nazwa_tabeli operacja1[, operacja2,...] gdzie możliwe operacje modyfikujące:
20 ADD [COLUMN] definicja_kolumny [FIRST|AFTER nazwa_kolumny] : stworzenie nowej kolumny, według składni instrukcji CREATE TABLE - domyślnie kolumna umieszczana jest jako ostatnia (opcje FIRST|AFTER w określonym miejscu - rozszerzenie MySQL)). 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],...)
21 ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [nazwa_indeksu] [index_type] (nazwa_kolumny_indeksowej[(długość)] [ASC | DESC],...) 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
22 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).
23 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
24 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]
25 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łaby 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.
26 Usuwanie tabel: DROP TABLE tabela1,... powoduje trwałe usunięcie zarówno danych zapisanych w tabelach, 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.
27 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).
28 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...
29 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 | | row in set (0.00 sec)
30 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 | | | B002 | Cicha 56 | Łomża | | rows in set (0.00 sec)
31 mysql> INSERT INTO biuro2 biuroNr, miasto SELECT biuroNr, miasto FROM biuro; Query OK, 1 row affected (0.05 sec) mysql> SELECT * FROM biuro2; | biuroNr | miasto | | B001 | Białystok | | B002 | Łomża | rows in set (0.00 sec)
32 Usuwanie wierszy instrukcją DELETE : Do 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 ).
33 mysql> DELETE FROM biuro WHERE biuroNr='B002'; SELECT * FROM biuro; mysql> SELECT * FROM biuro; | biuroNr | ulica | miasto | kod | | B001 | Piękna 46 | Białystok | | row in set (0.00 sec) Usunięcie biura o numerze B002: mysql> DELETE FROM biuro; mysql> SELECT * FROM biuroł Empty set (0.00 sec) Usunięcie wszystkich biur:
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
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');
36 mysql> source biuro.sql Query OK, 1 row affected (0.02 sec) Connection id: 1 Current 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>
37 mysql> SELECT * FROM biuro; | biuroNr | ulica | miasto | kod | | B001 | Piękna 46 | Białystok | | | B002 | Cicha 56 | Łomża | | rows in set (0.00 sec) Wyświetlenie zawartości tabeli:
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 | | | B002 | Cicha 56 | Łomża | | | B003 | Mała 63 | Białystok | | | B004 | Miodowa 32 | Grajewo | | | B005 | Dobra 22 | Łomża | | | B006 | Słoneczna 55 | Białystok | | | B007 | Akacjowa 16 | Augustów | | rows in set (0.00 sec)
39
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:
41 mysql> SELECT * FROM biuro; | biuroNr | ulica | miasto | kod | | B001 | Piękna 46 | Białystok | | | B002 | Cicha 56 | Łomża | | | B003 | Mała 63 | Białystok | | | B004 | Miodowa 32 | Grajewo | | | B005 | Dobra 22 | Łomża | | | B006 | Słoneczna 55 | Białystok | | | B007 | Akacjowa 16 | Augustów | | rows in set (0.00 sec)
42 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 | | | B002 | Cicha 56 | Łomża | | | B003 | Mała 63 | Białystok | | | B004 | Miodowa 32 | Grajewo | | | B005 | Dobra 22 | Łomża | | | B006 | Słoneczna 55 | Białystok | | | B007 | Akacjowa 16 | Augustów | | rows in set (0.00 sec)
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 Administrator automatycznie
44 Wyświetlanie zapisu tworzenia tabeli: mysql> SHOW CREATE TABLE personel\G ************************** 1. row ************************** Table: personel Create 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_ci 1 row in set (0.02 sec)
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 | | rows in set (0.02 sec) Polecenie równoważne: SHOW COLUMNS FROM personel;
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:
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:
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:
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)
50 Wyświetlanie indeksów tabeli personel : mysql> SHOW INDEX FROM personel\G ************************** 1. row ************************** Table: personel Non_unique: 0 Key_name: PRIMARY Seq_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: biuroNr Seq_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)
51 Powiązania kluczy obcych:
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).
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 ).
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 REPLACE nowo wczytany rekord zastępuje wiersze o kolidujących wartościach kluczy, przy IGNORE - rekord taki zostanie zignorowany (pominięty).
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.
56 Np. dla pliku zlokalizowanego C:\MySQL5\data\biuro\personel.txt o zawartości: SA8KatarzynaMorawskakierownikK B007 SA9MariaHojnaasystentK B007 SB20SabinaBoberdyrektorK B003 SB21DanielFrankowskikierownikM B003 SB22MałgorzataKowalskaasystentK B003 SB23AnnaBiałyasystentK B003 SB30KatarzynaMichalskadyrektorK B006 SB31DawidPiotrowskiasystentM B006 SB32MałgorzataPlichtaasystentK B006 SG20KarolinaMuchadyrektorK B004 SG21PiotrCybulskiasystentM B004 SL20PawełNowakkierownikM B002 SL21PawełKowalskiasystentM B002 SL22MonikaMunkasystentK B002 SL30JanWiśniewskidyrektorM B005 SL31JuliaLisickaasystentK B005 SL32MichałBrzęczykasystentM B005
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;
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.
59 np. dla tabeli biuro o zawartości: mysql> SELECT * FROM biuro; | biuroNr | ulica | miasto | kod | | B001 | Piękna 46 | Białystok | | | B002 | Cicha 56 | Łomża | | | B003 | Mała 63 | Białystok | | | B004 | Miodowa 32 | Grajewo | | | B005 | Dobra 22 | Łomża | | | B006 | Słoneczna 55 | Białystok | | | B007 | Akacjowa 16 | Augustów | |
60 mysql> SELECT * INTO OUTFILE 'C:/tmp/biuro.txt' FROM biuro; Polecenie: spowoduje utworzenie pliku biuro.txt o zawartości: B001Piękna 46Białystok B002Cicha 56Łomża B003Mała 63Białystok B004Miodowa 32Grajewo B005Dobra 22Łomża B006Słoneczna 55Białystok B007Akacjowa 16Augustów16-300