create table
Transkrypt
create table
MySQL (www.mysql.org) Plan wykładu: – Wprowadzenie – Użytkowanie – Administracja Wprowadzenie Licencjonowanie (serwer „półdarmowy”) • OpenSource – GPL (dotyczy także luźnego powiązania) • Commercial license (koszt zakupienia licencji) 2 Wprowadzenie (2) • Serwer dostępny na różne systemy operacyjne: Linux, Microsoft Windows, FreeBSD, Sun Solaris, IBM's AIX, Mac OS X, HP-UX, AIX, QNX, Novell NetWare, SCO OpenUnix, SGI Irix, i Dec OSF • Szybkość • Duże rozmiary bazy danych MySQL – w zależności od typu tabeli: – MyISAM – 65536TB (jeden plik; domyślnie 4GB) Ograniczenie systemu operacyjnego (2GB – 16TB) – InnoDB – 64TB (wiele plików) 3 Wprowadzenie (3) • Duży podzbiór ANSI SQL 99 • Obecne możliwości i planowane ulepszenia: Feature MySQL version Subqueries 4.1 R-trees 4.1 (dla tabel MyISAM) Stored procedures 5.0 Views 5.0 Cursors 5.0 -------------------------------------------Foreign keys 5.2 (już w 3.23 dla InnoDB) Triggers 5.0 (niepełne) i 5.1 4 Użytkowanie Typy danych ● Liczby całkowite: TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT ● Liczby zmiennoprzecinkowe: FLOAT, DOUBLE ● Liczby stałoprzecinkowe: DECIMAL(M, N) ● Data i czas: DATETIME, DATE, TIMESTAMP, TIME, i YEAR ● Napisy: CHAR, VARCHAR, TEXT ● Typ wyliczeniowy: ENUM ● Typ zbiorowy: SET ● Typ danych binarnych: BINARY, VARBINARY, BLOB 5 Użytkowanie (2) Mapowanie typów dostępnych w innych serwerach w trakcie tworzenia tabeli Inny typ • BINARY(NUM) • CHAR VARYING(NUM) • FLOAT4 • FLOAT8 • INT1 • INT2 • INT3 • INT4 • INT8 • LONG VARBINARY • LONG VARCHAR • MIDDLEINT • VARBINARY(NUM) Typ MySQL CHAR(NUM)BINARY VARCHAR(NUM) FLOAT DOUBLE TINYINT SMALLINT MEDIUMINT INT BIGINT MEDIUMBLOB MEDIUMTEXT MEDIUMINT VARCHAR(NUM) BINARY 6 Użytkowanie (3) ENUM('one', 'two', 'three') Wartość Indeks (wartość alternatywna) • NULL NULL • '' 0 • 'one' 1 • 'two' 2 • 'three' 3 7 Użytkowanie (4) SET('a','b','c','d') (elementom przyporządkowane są bity od najmniej znaczącego) Wartość • 'a' • 'b' • 'c' • 'd' Indeks (wartość alternatywna) 1 2 4 8 Kolejność: kol='a,c' lub kol='c,a' da w wyniku 'a,c' (przy SELECT oraz porównywaniu): • mysql> SELECT * FROM tab WHERE kol LIKE '%c%'; • mysql> SELECT * FROM tab WHERE FIND_IN_SET('c',kol)>0; • mysql> SELECT * FROM tab WHERE kol = 'a,c'; • mysql> SELECT * FROM tab WHERE kol & 1; 8 Użytkowanie (5) Napisy: 'napis' "inny napis" • ' w napisie otoczonym ' można zapisać jako ' ' • " w napisie otoczonym " można zapisać jako " " • Można także poprzedzić znakiem \ 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello', "hello", "'hello'", "''hello''", "hel""lo", "\"hello" 9 Użytkowanie (6) Napisy: • Maski i wyrażenia regularne (REGEXP i NOT REGEXP) SELECT * FROM tab WHERE nazwa LIKE "%fy"; SELECT * FROM tab WHERE nazwa REGEXP "^[bB]"; 10 Użytkowanie (7) BLOB – używać jak TEXT, ale wewnętrzna reprezentacja binarna UPDATE tab SET blob_col=LOAD_FILE('/tmp/picture') WHERE id=1; (uprawnienie – FILE) 11 Użytkowanie (8) Sortowanie i porównywanie napisów • Domyślna strona kodowa: ISO-8859-1 (Latin1) • Ustawienia strony kodowej można ominąć korzystając z atrybutu BINARY dla napisów (nie mylić z typem pola), który nakazuje korzystanie z ustawień regionalnych systemu (np. Windows). • Wsparcie dla języka polskiego przez użycie jednej z podanych poniżej stron kodowych: cp1250 (Windows), cp852 (DOS), ISO-8859-2 (Latin2), od wersji 4.1 – Unicode (UCS2 i UTF-8). 12 Użytkowanie (9) Generowanie unikalnego klucza: • Na polu typu liczbowego: AUTO_INCREMENT odczyt ostatniej wartości przez: LAST_INSERT_ID() • Typ: SERIAL => BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE 13 Użytkowanie (10) Rozszerzenie SQL (1) • Operacja REPLACE zamiast dwóch DELETE + INSERT (wstawianie nowych lub aktualizacja istniejących elementów). • INSERT, REPLACE, DELETE, i UPDATE – LOW_PRIORITY – niski priorytet z czekaniem – DELAYED – niski priorytet bez czekania (żądanie wstawione do kolejki) – HIGH_PRIORITY – wysoki priorytet z czekaniem 14 Użytkowanie (11) Rozszerzenie SQL (2) • Operatory || i && są traktowane jak logiczne OR i AND (jak w języku C). Zamiast || należy korzystać z funkcji CONCAT() przyjmującej dowolną liczbę parametrów • Ustawianie wartości zmiennych poprzez := SELECT @a:=SUM(total),@b=COUNT(*), @a/@b AS avg FROM test_table; SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3; 15 Użytkowanie (12) Wyszukiwanie pełnotekstowe (tylko MyISAM) Indeks o nazwie FULLTEXT Wyszukiwanie przez funkcję MATCH...AGAINST CREATE TABLE artykuly ( id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, tytul VARCHAR(200), tresc TEXT, FULLTEXT (tytul,tresc) ); W przypadku gdy szukane słowo określałoby ponad połowę wierszy, jest wtedy uznawane za słowo mało znaczące (słabo selekcjonujące) i nie jest brane pod uwagę przy wyszukiwaniu. 16 Użytkowanie (13) Wyszukiwanie pełnotekstowe (2) INSERT INTO artykuly VALUES (NULL,'MySQL Tutorial', 'DBMS stands for DataBase ...'), (NULL,'How To Use MySQL Efficiently', 'After you went through a ...'), (NULL,'Optimising MySQL','In this tutorial we will show ...'), (NULL,'1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), (NULL,'MySQL vs. YourSQL', 'In the following database comparison ...'), (NULL,'MySQL Security', 'When configured properly, MySQL ...'); SELECT * FROM artykuly WHERE MATCH (tytul,tresc) AGAINST ('database'); +----+-------------------+------------------------------------------+ | id | tytul | tresc | +----+-------------------+------------------------------------------+ | 5 | MySQL vs. YourSQL | In the following database comparison ... | | 1 | MySQL Tutorial | DBMS stands for DataBase ... | +----+-------------------+------------------------------------------+ 2 rows in set (0.00 sec) SELECT * FROM artykuly WHERE MATCH (tytul,tresc) AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE); 17 Użytkowanie (14) Typy tabel – niezależny silnik dostępu do danych • Nietransakcyjne (szybkie) – MyISAM – bazuje na ISAM, ('.MYI' – MYIndex, '.MYD' – MYData) - BTree – MEMORY/HEAP – używa hash-indeks, BTree ('.frm' – format, dane w pamięci RAM) – MERGE – użycie kilku tabel MyISAM ('.frm' – format, '.MRG' – linki do tabel) 18 Użytkowanie (15) • Transakcyjne, klucze obce – InnoDB – używa BTree indeksy (ewentualnie automatycznie wygenerowany hash-index na podstawie BTree indeksu) – BDB (BerkeleyDB) – używa BTree indeksy ('.frm' – format, '.db' – dane i indeksy) 19 Użytkowanie (16) • HEAP CREATE TABLE test ENGINE = HEAP SELECT ip, SUM(downloads) AS down FROM log_table GROUP BY ip; SELECT COUNT(ip),AVG(down) FROM test; DROP TABLE test; CREATE TABLE lookup (id INT) ENGINE = MEMORY; CREATE INDEX id_index USING BTREE ON lookup (id); 20 Użytkowanie (17) • InnoDB CREATE TABLE parent(id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB; CREATE TABLE child(id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE SET NULL ) ENGINE=INNODB; 21 Użytkowanie (18) CREATE TABLE product (category INT NOT NULL, id INT NOT NULL, price DECIMAL, PRIMARY KEY(category, id)) ENGINE=INNODB; CREATE TABLE customer (id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB; 22 Użytkowanie (19) CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT, product_category INT NOT NULL, product_id INT NOT NULL, customer_id INT NOT NULL, PRIMARY KEY(no), INDEX (product_category, product_id), FOREIGN KEY (product_category, product_id) REFERENCES product(category, id) ON UPDATE CASCADE ON DELETE RESTRICT, INDEX (customer_id), FOREIGN KEY (customer_id) REFERENCES customer(id)) ENGINE=INNODB; 23 Użytkowanie (20) Transakcje • START TRANSACTION / SET AUTOCOMMIT=0 • COMMIT / ROLLBACK • Punkty kontrolne – możliwość wycofania się do określonego miejsca wewnątrz transakcji – SAVEPOINT identifier – ROLLBACK TO SAVEPOINT identifier 24 Użytkowanie (21) Transakcje (2) • Blokowanie tabel – dostęp wyłączny – LOCK TABLES tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE} [, tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE} ...] – ... – UNLOCK TABLES 25 Użytkowanie (22) Poziomy izolacji SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ (def.) | SERIALIZABLE } • global – będzie domyślny dla następnych • session – aktualny w obrębie sesji • READ UNCOMMITTED – "brudny odczyt" • READ COMMITTED – czyta zatwierdzone • REPEATABLE READ – domyślny, odczyt powtarzalny • SERIALIZABLE – pełna szeregowalność 26 Użytkowanie (23) Przykład użycia • Utworzenie bazy danych i podłączenie się do niej SHOW DATABASES; CREATE DATABASE zwierzaki; USE zwierzaki; • Utworzenie tabeli SHOW TABLES; CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20), species VARCHAR(20), sex CHAR(1), birth DATE, death DATE); DESCRIBE pet; • Załadowanie danych INSERT INTO pet VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL); 27 Użytkowanie (24) Przykład użycia (2) • Pobranie danych SELECT what_to_select FROM which_table WHERE conditions_to_satisfy; SELECT DISTINCT owner FROM pet; SELECT name, birth, CURDATE(), (YEAR(CURDATE()) - YEAR(birth)) (RIGHT(CURDATE(),5) < RIGHT(birth,5)) AS age FROM pet; 28 Administracja Użytkownicy i uprawnienia • ACL (Access Control Lists) informacja jest przechowywana w tabelach systemowych: •mysql.user •mysql.db •mysql.host •mysql.tables_priv •mysql.columns_priv •mysql.procs_priv 29 Administracja (2) Użytkownicy i uprawnienia (2) • Użytkownicy (autoryzacja) •nazwa użytkownika •adres, z którego się łączy (może być podana maska) 30 Administracja (3) Użytkownicy i uprawnienia (3) • Dostęp do zasobów - poziomy hierarchii •Global level – GRANT/REVOKE ... ON *.* •Database level – GRANT/REVOKE ... ON db.* •Table level – GRANT/REVOKE ... ON db.table •Column level – tabela: mysql.columns_priv •Routine level – GRANT/REVOKE ... ON ... 31 Administracja (4) Rodzaje uprawnień •ALL [PRIVILEGES] •ALTER •CREATE •CREATE TEMPORARY TABLES •DELETE •DROP •EXECUTE •FILE •INDEX •INSERT •LOCK TABLES •PROCESS •REFERENCES •RELOAD •REPLICATION CLIENT •REPLICATION SLAVE •SELECT •SHOW DATABASES •SHUTDOWN •SUPER •UPDATE •USAGE (brak uprawnień) •GRANT OPTION 32 Administracja (5) • Tworzenie użytkownika CREATE USER david [IDENTIFIED BY [PASSWORD] 'password'] • Usuwanie użytkownika DROP USER david; 33 Administracja (6) • Zmiana hasła SET PASSWORD FOR 'u1'@'h1' = PASSWORD('newpwd'); • Zmiana hasła przez tabele systemowe: UPDATE mysql.user SET Password=PASSWORD('new_password') WHERE user='u1' AND host='h1'; FLUSH PRIVILEGES; // bo używał tabeli 34 Administracja (7) • Nadawanie praw (gdy brak użytkownika, to zostanie założony) GRANT ALL PRIVILEGES ON db.* TO david@'192.58.197.0/255.255.255.0'; • Usuwanie praw •nie usuwa użytkownika (DROP USER) •usunięcie tabeli nie usuwa praw do tabeli 35 Administracja (8) • Ograniczenie wykorzystania zasobów GRANT ... WITH MAX_QUERIES_PER_HOUR N1 MAX_UPDATES_PER_HOUR N2 MAX_CONNECTIONS_PER_HOUR N3; 36 Administracja (9) Domyślne uprawnienia • 'root' bez hasła z 'localhost' (root@localhost) • 'anonymous' bez hasła (@localhost/hostname) do bazy •'test' •rozpoczynającej się od 'test_' 37 Administracja (10) •Tabele bazy danych są zapisane w oddzielnych plikach •Baza danych jest przechowywana w oddzielnym katalogu •Można wykonać kopię bazy z poziomu systemu operacyjnego z użyciem: •LOCK TABLES – zablokowanie tabel •FLUSH TABLES – zapisanie wszystkich danych z cache tabeli do pliku •“file copy” 38 Administracja (11) •Wykonanie kopii danych do pliku SELECT ... INTO OUTFILE 'file_name' LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet; •Tylko dla MyISAM BACKUP TABLE tbl_name[,tbl_name...] TO '/path/to/backup/directory' RESTORE TABLE tbl_name[,tbl_name...] FROM '/path/to/backup/directory' 39 Administracja (12) Program do zrzucenia bazy do pliku SQL mysqldump [OPTIONS] database [tables] > backup-file.sql mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2...] mysqldump [OPTIONS] --all-databases [OPTIONS] mysql database < backup-file.sql 40 Administracja (13) •Sprawdzenie tabeli CHECK TABLE tbl_name[,tbl_name...] [option [option...]] Gdzie option: QUICK | FAST | MEDIUM | EXTENDED | CHANGED •Naprawa tabeli REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name[,tbl_name...] [QUICK] [EXTENDED] [USE_FRM] 41 Administracja (14) Kanały komunikacyjne • TCP/IP 3306 • socket – Unix, pipe – WinNT (potoki) • zawiera SSL, od klienta wymagana konfiguracja tunelu dla portu 3306 42