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: 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).
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.
Tworzenie tabeli Biuro: CREATE TABLE biuro.biuro ( numer VARCHAR(4) NOT NULL, ulica VARCHAR(25) NOT NULL, miasto VARCHAR(25) NOT NULL, kod VARCHAR(6) NOT NULL, PRIMARY KEY (numer) )ENGINE = InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;
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.
Opcje dotyczące wszystkich typów: 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.
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.
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.
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.
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 [index_type] (nazwa_kolumny [(dłudość)] [ASC | DESC],...) index_type: USING {BTREE | HASH | RTREE}
{INDEX|KEY} [nazwa_indeksu] (nazwa_kolumny_indeksowej [(dłudość)] , {INDEX|KEY} [nazwa_indeksu] (nazwa_kolumny_indeksowej [(dłudość)] , ..) [index_type] 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.
[CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [nazwa_indeksu] [index_type] (nazwa_kolumny_indeksowej,...) deklaruje indeks o nie powtarzających się wartościach. Kolumna typu BLOB nie może być indeksowana.
CHECK TABLE nazwa_tabeli [opcje] opcje = {FOR UPGRADE | QUICK | FAST | MEDIUM | EXTENDED | CHANGED} deklaracja zaimplementowana w MySQL 5.1.9 QUICK Do not scan the rows to check for incorrect links. FAST Check only tables that have not been closed properly. CHANGED Check only tables that have been changed since the last check or that have not been closed properly. MEDIUM Scan rows to verify that deleted links are valid. This also calculates a key checksum for the rows and verifies this with a calculated checksum for the keys. EXTENDED Do a full key lookup for all keys for each row. This ensures that the table is 100% consistent, but takes a long time.
ANALYZE TABLE nazwa_tabeli REPAIR TABLE nazwa_tabeli OPTIMIZE TABLE nazwa_tabeli
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, widok nie może być w danej chwili używany przez jakikolwiek obiekt w bazie.
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.
Indeksy zajmują też miejsce na dysku:
Wyświetlanie zapisu tworzenia tabeli: mysql> show create table biuro\G ************************** 1. row ************************** Table: biuro Create Table: CREATE TABLE `biuro` ( `numer` varchar(4) NOT NULL, `ulica` varchar(25) NOT NULL, `miasto` varchar(25) NOT NULL, `kod` varchar(6) NOT NULL, PRIMARY KEY (`numer`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE= utf8 _polish_ci 1 row in set (0.00 sec) mysql>
Prezentacja struktury tabeli: mysql> DESCRIBE biuro; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | | numer | 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;
Rozszerzona prezentacja struktury tabeli: mysql> SHOW FULL COLUMNS FROM biuro\G *************************** 1. row *************************** Field: numer 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) Key:
*************************** 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)
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)
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).
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],...)
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
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).
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
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]
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.
Usuwanie tabel: Zmiana nazwy tabeli: 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: RENAME TABLE stara_nazwa_tabeli TO nowa_nazwa_tabeli [, stara_nazwa_tabeli2 TO nowa_nazwa_tabeli2] ... - jednej lub więcej.
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).
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 ...
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)
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)
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).
Usunięcie biura o numerze B002: Usunięcie wszystkich biur: 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 wszystkich biur: mysql> DELETE FROM biuro; SELECT * FROM biuro Query OK, 1 row affected (0.03 sec) Empty set (0.00 sec)
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
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');
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) mysql>
Wyświetlenie zawartości tabeli: 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)
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)
Modyfikowanie danych: 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
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)
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)
Tworzymy drugą powiązaną kluczem obcym tabelę: 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) KEY `biuroNr` (`biuroNr`) – indeksy do kluczy obcych są tworzone w MySQL automatycznie
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)
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;
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) Key:
*************************** 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
*************************** 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
*************************** 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 Key: MUL 8 rows in set (0.02 sec)
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 ************************** Non_unique: 1 Key_name: biuroNr Column_name: biuroNr 2 rows in set (0.02 sec)
Powiązania kluczy obcych:
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).
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).
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).
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.
Np. dla pliku zlokalizowanego C:\MySQL5\data\biuro\personel Np. dla pliku zlokalizowanego C:\MySQL5\data\biuro\personel.txt o zawartości: SA8 Katarzyna Morawska kierownik K 1971-5-6 1700 B007 SA9 Maria Hojna asystent K 1970-2-19 900 B007 SB20 Sabina Bober dyrektor K 1940-6-3 2400 B003 SB21 Daniel Frankowski kierownik M 1958-3-24 1800 B003 SB22 Małgorzata Kowalska asystent K 1972-3-15 1000 B003 SB23 Anna Biały asystent K 1960-11-10 1200 B003 SB30 Katarzyna Michalska dyrektor K 1960-11-17 2500 B006 SB31 Dawid Piotrowski asystent M 1975-3-22 1100 B006 SB32 Małgorzata Plichta asystent K 1971-10-3 1200 B006 SG20 Karolina Mucha dyrektor K 1953-3-3 2200 B004 SG21 Piotr Cybulski asystent M 1974-12-6 1300 B004 SL20 Paweł Nowak kierownik M 1962-2-2 1500 B002 SL21 Paweł Kowalski asystent M 1969-5-5 1000 B002 SL22 Monika Munk asystent K 1977-7-26 1100 B002 SL30 Jan Wiśniewski dyrektor M 1945-10-1 3000 B005 SL31 Julia Lisicka asystent K 1965-7-13 900 B005 SL32 Michał Brzęczyk asystent M 1959-3-15 1000 B005
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;
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.
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 |
spowoduje utworzenie pliku biuro.txt o zawartości: Polecenie: mysql> SELECT * INTO OUTFILE 'C:/tmp/biuro.txt' FROM biuro; spowoduje utworzenie pliku biuro.txt o zawartości: 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