55
1 Procedury i funkcje CREATE PROCEDURE nazwa ([proc_parameter[,...]]) [characteristic ...] routine_body CREATE FUNCTION nazwa ([func_parameter[,...]]) RETURNS type [characteristic ...] routine_body proc_parameter: [ IN | OUT | INOUT ] param_name type func_parameter: param_name type Tworzenie:

Procedury i funkcje

  • Upload
    teal

  • View
    19

  • Download
    0

Embed Size (px)

DESCRIPTION

Procedury i funkcje. Tworzenie:. CREATE PROCEDURE nazwa ([proc_parameter[,...]]) [characteristic ...] routine_body CREATE FUNCTION nazwa ([func_parameter[,...]]) RETURNS type [characteristic ...] routine_body. proc_parameter: [ IN | OUT | INOUT ] param_name type func_parameter: - PowerPoint PPT Presentation

Citation preview

Page 1: Procedury i funkcje

1

Procedury i funkcje

CREATE

PROCEDURE nazwa ([proc_parameter[,...]])

[characteristic ...] routine_body

CREATE

FUNCTION nazwa ([func_parameter[,...]])

RETURNS type

[characteristic ...] routine_body

proc_parameter:

[ IN | OUT | INOUT ] param_name type

func_parameter:

param_name type

Tworzenie:

Page 2: Procedury i funkcje

2

CREATE PROCEDURE przecena(IN nazwa varchar (64))UPDATE nieruchomoscSET czynsz = czynsz*1.2WHERE miasto = nazwa;

mysql> SELECT nieruchomoscNr, miasto, czynsz, biuroNr FROM nieruchomosc;+----------------+-----------+--------+---------+| nieruchomoscNr | miasto | czynsz | biuroNr |+----------------+-----------+--------+---------+| A14 | Augustów | 858 | B007 || B16 | Białystok | 495 | B003 || B17 | Białystok | 412 | B003 || B18 | Białystok | 385 | B003 || B21 | Białystok | 660 | B003 || G01 | Grajewo | 830 | B004 || L94 | Łomża | 440 | B005 |+----------------+-----------+--------+---------+7 rows in set (0.00 sec)

Prosty przykład:

Page 3: Procedury i funkcje

3

CALL przecena('Augustów');

Wywołanie procedury:

mysql> CALL przecena('Augustów');Query OK, 1 row affected (0.01 sec)

mysql> SELECT nieruchomoscNr, miasto, czynsz, biuroNr FROM nieruchomosc;+----------------+-----------+--------+---------+| nieruchomoscNr | miasto | czynsz | biuroNr |+----------------+-----------+--------+---------+| A14 | Augustów | 1030 | B007 || B16 | Białystok | 495 | B003 || B17 | Białystok | 412 | B003 || B18 | Białystok | 385 | B003 || B21 | Białystok | 660 | B003 || G01 | Grajewo | 830 | B004 || L94 | Łomża | 440 | B005 |+----------------+-----------+--------+---------+7 rows in set (0.00 sec)

Page 4: Procedury i funkcje

4

Schemat bazy Biuro Nieruchomości:

Page 5: Procedury i funkcje

5

Zadanie:

Zrealizować procedurę, która będzie zwiększać płacę pracowników o wartość podaną przy wywołaniu jako dana wejściowa dla stanowiska też podanego przy wywołaniu.

CREATE PROCEDURE podwyzka(IN ile int(4), IN jaki varchar (15))UPDATE personelSET pensja = pensja+ileWHERE stanowisko = jaki;

CALL podwyzka(50, 'asystent');

Page 6: Procedury i funkcje

6

Przykład procedury losującej uczniów do klas:

DELIMITER |

CREATE PROCEDURE UtworzUczniow(IN r INT, IN kl CHAR, IN chlopcy INT, IN dziewczynki INT)BEGIN DECLARE dz INT; DECLARE ch INT; DECLARE rdata DATE; CASE r WHEN 1 THEN SET rdata='1992-01-01'; WHEN 2 THEN SET rdata='1991-01-01'; WHEN 3 THEN SET rdata='1990-01-01'; ELSE SELECT 'ERROR - ZLY ROK'; END CASE;

Page 7: Procedury i funkcje

7

SET dz=0; WHILE (dz < dziewczynki) DO INSERT INTO Uczniowie VALUES (0, (SELECT nazwisko FROM __Nazwiska ORDER BY rand() LIMIT 1), (SELECT imie FROM __Imiona WHERE plec='K' ORDER BY rand() LIMIT 1), (SELECT rdata - INTERVAL rand()*365+1 DAY),'K', (SELECT id_klasy FROM Klasy WHERE rok=r AND klasa=kl)); SET dz=dz+1; END WHILE;

Page 8: Procedury i funkcje

8

SET ch=0; WHILE (ch < chlopcy) DO INSERT INTO Uczniowie VALUES (0, (SELECT nazwisko FROM __Nazwiska ORDER BY rand() LIMIT 1), (SELECT imie FROM __Imiona WHERE plec='M' ORDER BY rand() LIMIT 1), (SELECT rdata - INTERVAL rand()*365+1 DAY),'M', (SELECT id_klasy FROM Klasy WHERE rok=r AND klasa=kl)); SET ch=ch+1; END WHILE;END|

DELIMITER ;

Page 9: Procedury i funkcje

9

Nazwiska:CREATE TABLE __Nazwiska (

id_nazwiska INT UNSIGNED NOT NULL auto_increment,nazwisko char(30) NOT NULL,UNIQUE id(id_nazwiska),PRIMARY KEY (id_nazwiska)

);

INSERT INTO __Nazwiska VALUES(0,'Ancypo'),(0,'Arciuch'),(0,'Awdziej'),(0,'Chwiedzko'),(0,'Cychowska'),(0,'Czaplejewicz'),(0,'Filonowicz'),(0,'Filon'),(0,'Kuzbiel'),(0,'Gryszkiewicz'),(0,'Jackiewicz'),(0,'Jurgiel'),(0,'Kazimierowicz'),(0,'Kostera'),(0,'Kostro'),(0,'Nowak'),(0,'Krawiel'),(0,'Krupowicz'),(0,'Mizer'),(0,'Mrozowicz'),(0,'Mucus'),(0,'Niedzwiedz'),(0,'Ostasiewicz'),(0,'Surowiec'),(0,'Anisko'),(0,'Antoniuk'),(0,'Borowik'),(0,'Chodziutko'),(0,'Gieniusz'),(0,'Grygucis'),(0,'Gryszko'),(0,'Jurgiel'),(0,'Karpowicz'),(0,'Kargul'),(0,'Pawlak'),(0,'Marcinkiewicz'),(0,'Miller'),(0,'Sidor'),(0,'Siemianczuk'),(0,'Misiukiewicz'),(0,'Szymczyk'),(0,'Taudul'),(0,'Zapolnik'),(0,'Klej'),(0,'Kucharewicz'),(0,'Chlus'),(0,'Cilulko'),(0,'Puszko'),(0,'Loszczyk'),(0,'Makarewicz'),(0,'Solniczek'),(0,'Szczesnowicz'),(0,'Szyszko'),(0,'Werda'),(0,'Sietejko'),(0,'Sawon'),(0,'Smola'),(0,'Sloma'),(0,'Sacharczuk'),(0,'Miszkin'),(0,'Baszko'),(0,'Bilkiewicz'),(0,'Czaplejewicz'),(0,'Osial'),(0,'Borys'),(0,'Salak'),(0,'Zajczyk'),(0,'Lazarewicz'),(0,'Rudnik'),(0,'Recko'),(0,'Szczesiul'),(0,'Luba'),(0,'Mroczko'),(0,'Abramowicz'),(0,'Beczko'),(0,'Bleczko'),(0,'Butkiewicz'),(0,'Daszkilewicz'),(0,'Galuzyn'),(0,'Gryc'),(0,'Gudel'),(0,'Toczko'),(0,'Malkiewicz'),(0,'Potapa'),(0,'Pupek'),(0,'Prycz'),(0,'Koleda'),(0,'Gniedziejko'),(0,'Juchniewicz'),(0,'Lengiewicz'),(0,'Turko'),(0,'Kulak'),(0,'Dudziuk'),(0,'Trochanowicz'),(0,'Stefanczuk'),(0,'Lopata'),(0,'Loskot'),(0,'Matuk'),(0,'Kijek'),(0,'Woronko'),(0,'Romanowicz'),(0,'Pylko'),(0,'Misarko'),(0,'Waluszko'),(0,'Toloczko'),(0,'Pigiel'),(0,'Stupak'),(0,'Zdanuk'),(0,'Mackiewicz'),(0,'Hecman')

;

Page 10: Procedury i funkcje

10

Imiona:

CREATE TABLE __Imiona (id_imienia INT UNSIGNED NOT NULL auto_increment,imie char(20) NOT NULL,plec ENUM('K','M'),UNIQUE id(id_imienia),PRIMARY KEY (id_imienia)

);

INSERT INTO __Imiona VALUES(0,'Lukasz','M'),(0,'Piotr','M'),(0,'Raroslaw','M'),(0,'Jacek','M'),(0,'Andrzej','M'),(0,'Maciej','M'),(0,'Zbigniew','M'),(0,'Leszek','M'),(0,'Kamil','M'),(0,'Pawel','M'),(0,'Wojciech','M'),(0,'Bartosz','M'),(0,'Jakub','M'),(0,'Marcin','M'),(0,'Rafal','M'),(0,'Adam','M'),(0,'Daniel','M'),(0,'Robert','M'),(0,'Boromir','M'),(0,'Slawomir','M'),(0,'Mateusz','M'),(0,'Marek','M'),(0,'Przemyslaw','M'),(0,'Mariusz','M'),(0,'Grzegorz','M'),(0,'Marzena','K'),(0,'Sylwia','K'),(0,'Edyta','K'),(0,'Urszula','K'),(0,'Malgorzata','K'),(0,'Justyna','K'),(0,'Magdalena','K'),(0,'Agnieszka','K'),(0,'Joanna','K'),(0,'Anna','K'),(0,'Monika','K'),(0,'Ewa','K'),(0,'Paulina','K'),(0,'Marta','K'),(0,'Jolanta','K'),(0,'Katarzyna','K'),(0,'Natalia','K'),(0,'Agata','K'),(0,'Elzbieta','K'),(0,'Celina','K'),(0,'Beata','K'),(0,'Karolina','K'),(0,'Dorota','K'),(0,'Izabela','K'),(0,'Wioletta','K')

;

Page 11: Procedury i funkcje

11

Wywołania:

call UtworzUczniow(3,'a',10,19);call UtworzUczniow(3,'b',6,24);call UtworzUczniow(3,'c',19,11);call UtworzUczniow(3,'d',14,13);call UtworzUczniow(3,'e',6,25);call UtworzUczniow(3,'f',7,20):call UtworzUczniow(2,'a',9,22);call UtworzUczniow(2,'b',18,8);call UtworzUczniow(2,'c',22,8);call UtworzUczniow(2,'d',13,17);call UtworzUczniow(2,'e',7,23);call UtworzUczniow(2,'f',3,26);call UtworzUczniow(1,'a',6,25);call UtworzUczniow(1,'b',20,10);call UtworzUczniow(1,'c',20,8);call UtworzUczniow(1,'d',16,15);call UtworzUczniow(1,'e',7,24);call UtworzUczniow(1,'f',7,25);

Page 12: Procedury i funkcje

12

Przykład funkcji:

mysql> CREATE FUNCTION Witajcie (s CHAR(20)) RETURNS CHAR(50)-> RETURN CONCAT('Witajcie, ',s,'!');Query OK, 0 rows affected (0.00 sec)

mysql> SELECT Witajcie('kochani');+---------------------+| Witajcie('kochani') |+---------------------+| Witajcie, kochani! |+---------------------+1 row in set (0.00 sec)

Page 13: Procedury i funkcje

13

IF:

IF warunek THEN instrukcje[ELSEIF warunek THEN instrukcje] ...[ELSE instrukcje]

END IF

Page 14: Procedury i funkcje

14

Wyzwalacze:

CREATETRIGGER nazwa trigger_time trigger_eventON tabela FOR EACH ROW trigger_stmt

Wyzwalacz nazwa związany z tabelą tabela.

trigger_time - określenie czasowe wykonania, może być: BEFORE lub AFTER instrukcji, która go

aktywuje

trigger_stmt – instrukcje wykonywane po aktywacji wyzwalacza

trigger_event – instrukcje, które aktywują wyzwalacz

Page 15: Procedury i funkcje

15

trigger_event – instrukcje, które aktywują wyzwalacz:

• INSERT: wyzwalacz jest aktywowany gdy tylko nowy wiersz jest wstawiany do tabeli; np. przez INSERT, LOAD DATA, czy REPLACE.

• UPDATE: wyzwalacz jest aktywowany gdy tylko wiersz jest uaktualniany; np. przez UPDATE.

• DELETE: wyzwalacz jest aktywowany gdy tylko wiersz jest usuwany z tabeli; np. przez DELETE czy REPLACE

Jednakże DROP TABLE nie aktywuje wyzwalacza

Page 16: Procedury i funkcje

16

Przykład:

mysql> CREATE TABLE test1(a1 INT);Query OK, 0 rows affected (0.14 sec)

mysql> CREATE TABLE test2(a2 INT);Query OK, 0 rows affected (0.08 sec)

mysql> CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY);Query OK, 0 rows affected (0.08 sec)

mysql> CREATE TABLE test4( -> a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, -> b4 INT DEFAULT 0 -> );Query OK, 0 rows affected (0.08 sec)

Page 17: Procedury i funkcje

17

mysql> DELIMITER |mysql> CREATE TRIGGER testref BEFORE INSERT ON test1 -> FOR EACH ROW BEGIN -> INSERT INTO test2 SET a2 = NEW.a1; -> DELETE FROM test3 WHERE a3 = NEW.a1; -> UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1; -> END; -> |Query OK, 0 rows affected (0.08 sec)

mysql> DELIMITER ;

Page 18: Procedury i funkcje

18

mysql> INSERT INTO test3 (a3) VALUES -> (NULL), (NULL), (NULL), (NULL), (NULL), -> (NULL), (NULL), (NULL), (NULL), (NULL);Query OK, 10 rows affected (0.05 sec)Records: 10 Duplicates: 0 Warnings: 0

mysql> INSERT INTO test4 (a4) VALUES -> (0), (0), (0), (0), (0), (0), (0), (0), (0),(0);Query OK, 10 rows affected (0.03 sec)Records: 10 Duplicates: 0 Warnings: 0

Page 19: Procedury i funkcje

19

mysql> SELECT * FROM test3+----+| a3 |+----+| 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 || 10 |+----+5 rows in set (0.01 sec)

mysql> SELECT * FROM test4+----+------+| a4 | b4 |+----+------+| 1 | 0 || 2 | 0 || 3 | 0 || 4 | 0 || 5 | 0 || 6 | 0 || 7 | 0 || 8 | 0 || 9 | 0 || 10 | 0 |+----+------+10 rows in set (0.00 sec)

Page 20: Procedury i funkcje

20

mysql> INSERT INTO test1 VALUES -> (1), (3), (1), (7), (1), (8), (4), (4);Query OK, 8 rows affected (0.09 sec)Records: 8 Duplicates: 0 Warnings: 0

Aktywacja wyzwalacza:

Page 21: Procedury i funkcje

21

mysql> SELECT * FROM test1+------+| a1 |+------+| 1 || 3 || 1 || 7 || 1 || 8 || 4 || 4 |+------+8 rows in set (0.00 sec)

mysql> SELECT * FROM test2+------+| a2 |+------+| 1 || 3 || 1 || 7 || 1 || 8 || 4 || 4 |+------+8 rows in set (0.00 sec)

Wyniki:

Page 22: Procedury i funkcje

22

mysql> SELECT * FROM test3+----+| a3 |+----+| 2 || 5 || 6 || 9 || 10 |+----+5 rows in set (0.01 sec)

mysql> SELECT * FROM test4+----+------+| a4 | b4 |+----+------+| 1 | 3 || 2 | 0 || 3 | 1 || 4 | 2 || 5 | 0 || 6 | 0 || 7 | 1 || 8 | 1 || 9 | 0 || 10 | 0 |+----+------+10 rows in set (0.00 sec)

Page 23: Procedury i funkcje

23

Cechy MySQL w wersjach:

Unions 4.0

Subqueries 4.1

R-trees 4.1 (dla tabeli MyISAM)

Procedury i funkcje 5.0

Views (perspektywy) 5.0

Cursors 5.0

Foreign keys 5.1 (od 3.23 dla InnoDB)

Triggers (wyzwalacze) 5.0 i 5.1

Full outer join 5.1 ?

Constraints (ograniczniki) 5.1

Page 24: Procedury i funkcje

24

Transakcje:

Transakcje w systemach zarządzania bazą danych stanowi sekwencje powiązanych ze sobą instrukcji, które muszą być traktowane jak pojedyncza jednostka. Rozumiemy to tak, że albo wszystkie zadania wchodzące w skład transakcji zostaną wykonane, albo żadne z nich.

Transakcja jest niepodzielna, ponieważ przy równoczesnym dostępie do zasobów przez wielu użytkowników lub trwających procesach, w czasie awarii może dojść do niespójności bazy danych.

Ważną cechą transakcji jest to, że są one nie widoczne dla innych sesji jeżeli nie zostaną wykonane. Nikt nie może odczytać danych z tabel, jeżeli jesteśmy w czasie ich aktualizacji

Page 25: Procedury i funkcje

25

MySQL oferuje transakcje zgodne z tzw. właściwościami ACID:

Atomicity ( niepodzielność) – nie ma możliwości podziału transakcji, albo wszystkie zmiany zostaną zachowane w bazie danych albo żadna z nich

Consistency (spójność) – oznacza, że operacje przekształcają bazę danych z jednego stanu prawidłowego w inny. Nie powinny być możliwe etapy, kiedy dane są niespójne.

Isolation (izolacja) – oznacza, że transakcje nie kolidują ze sobą, gdy są wykonywane. Każda transakcja powinna być wykonywana tak, jakby w danej chwili tylko ona mogła wykonywać operacje odczytu i aktualizacji.

Durability (trwałość) – oznacza, że po wykonaniu transakcji w bazie danych, efekty transakcji są stałe.

Page 26: Procedury i funkcje

26

START TRANSACTION [WITH CONSISTENT SNAPSHOT] | BEGIN [WORK]

COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]

ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]

SET AUTOCOMMIT = {0 | 1}

Transakcje rozpoczynamy wydając polecenie START TRANSACTION lub jego synonimy BEGIN WORK oraz BEGIN. Zalecane jest używanie tej pierwszej postaci, gdyż jest ona zgodna z norma SQL-99.

Page 27: Procedury i funkcje

27

MySQL może pracować w dwóch trybach. Pierwszy, zwany autocommit, powoduje, że każde wydawane polecenie jest traktowana jako transakcja. Oznacza to, ze wynik działania tego polecenia jest automatycznie zatwierdzany w bazie danych i nie ma możliwości jego wycofania.

Aby wyłączyć działanie trybu autocommit należy wydąć polecenie:

SET AUTOCOMMIT = 0;

Wówczas można samodzielnie wydawać polecenia START TRANSACTION, COMMIT oraz ROLLBACK. Pierwsze z nich rozpoczyna nową transakcje, drugie zatwierdza wszystkie zmiany wprowadzone w ramach bieżącej transakcji. Ostatnie natomiast polecenie wycofuje wszystkie zmiany wprowadzone w ramach bieżącej transakcji.

Page 28: Procedury i funkcje

28

Przykład:mysql> CREATE TABLE test (id INT PRIMARY KEY) ENGINE = InnoDB;mysql> INSERT INTO test VALUES (1), (2);mysql> select * from test;+----+| id |+----+| 1 || 2 |+----+mysql> SET AUTOCOMMIT = 0;mysql> START TRANSACTION;mysql> UPDATE test SET id=10 WHERE id=1;mysql> UPDATE test SET id=20 WHERE id=2;mysql> SELECT * FROM test;+----+| id |+----+| 10 || 20 |+----+mysql> COMMIT;

Page 29: Procedury i funkcje

29

Po wykonaniu instrukcji SET AUTOCOMMIT = 0, MySQL zakłada, ze od tej pory wszystkie transakcje będą przez użytkownika jawnie kończone poleceniem COMMIT. Należy o tym zawsze pamiętać, bo gdy o tym zapomnimy i zakończymy sesje (np. zamykając aplikacje kliencką), MySQL automatycznie wycofa wszystkie zmiany wprowadzone w czasie całej sesji!

Ponowny powrót do trybu autocommit spowoduje polecenie:

SET AUTOCOMMIT = 1;

Sprawdzamy jaki tryb zatwierdzania transakcji obowiązuje:

mysql> SELECT @@AUTOCOMMIT;+--------------+| @@AUTOCOMMIT |+--------------+| 1 |+--------------+

Page 30: Procedury i funkcje

30

Przykład z wycofaniem:

---------------| SESJA A |---------------

mysql> SET AUTOCOMMIT = 0;mysql> START TRANSACTION;

---------------| SESJA B |---------------

mysql> SELECT * FROM test;+------+| id |+------+| 1 |+------+

mysql> UPDATE test SET id = 2;

  mysql> SELECT * FROM test;+------+| id |+------+| 1 |+------+

mysql> DELETE FROM test;

Page 31: Procedury i funkcje

31

mysql> SELECT * FROM test;+------+| id |+------+| 1 |+------+mysql> UPDATE test SET id = 2;---------------------------- sesja zablokowana ----------------------------

mysql> ROLLBACK;

-------------------------- sesja ’puszcza’ --------------------------mysql> UPDATE test SET id = 2;Query OK, 1 row affected (2.13 sec)Rows matched: 1 Changed: 1 Warnings: 0mysql> SELECT * FROM test;+------+| id |+------+| 2 |+------+

Page 32: Procedury i funkcje

32

Przykład z zakleszczeniem:mysql> DROP TABLE test;mysql> CREATE TABLE test (id INT PRIMARY KEY) ENGINE = InnoDB;mysql> INSERT INTO test VALUES

(1), (2);mysql> COMMIT;mysql> select * from test;+----+| id |+----+| 1 || 2 |+----+

---------------| SESJA A |---------------

             

---------------| SESJA B |---------------

mysql> SET AUTOCOMMIT = 0; mysql> SET AUTOCOMMIT = 0;

mysql> START TRANSACTION; mysql> START TRANSACTION;

mysql> UPDATE test SET id=10 WHERE id=1;

 

mysql> UPDATE test SET id=20 WHERE id=2;

Page 33: Procedury i funkcje

33

mysql> UPDATE test SET id=20 WHERE id=2;

---------------------------- sesja zablokowana ----------------------------

mysql> UPDATE test SET id=10 WHERE id=1;

-----------------------

--- sesja ’puszcza’ ---

-----------------------

Query OK, 1 row affected (21.44 sec) Rows matched: 1 Changed: 1 Warnings: 0

mysql> UPDATE test SET id=10 WHERE id=1;

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

mysql>

Page 34: Procedury i funkcje

34

mysql> SELECT * FROM test;+----+| id |+----+| 10 || 20 |+----+

mysql> SELECT * FROM test;

+----+

| id |

+----+

| 1 |

| 2 |

+----+

mysql> COMMIT;

Query OK, 0 rows affected (0.00 sec)

Page 35: Procedury i funkcje

35

mysql> SELECT * FROM test;+----+| id |+----+| 1 || 2 |+----+mysql> COMMIT;Query OK, 0 rows affected (0.00 sec)mysql> SELECT * FROM test;+----+| id |+----+| 10 || 20 |+----+

Page 36: Procedury i funkcje

36

Zakleszczanie bez klucza głównego:

mysql> DROP TABLE test;mysql> CREATE TABLE test (id INT)

ENGINE = InnoDB;mysql> INSERT INTO test VALUES

(1), (2);mysql> COMMIT;mysql> select * from test;+----+| id |+----+| 1 || 2 |+----+

---------------| SESJA A |---------------

     

  

---------------| SESJA B |---------------

mysql> SET AUTOCOMMIT = 0; mysql> SET AUTOCOMMIT = 0;

mysql> START TRANSACTION; mysql> START TRANSACTION;

mysql> UPDATE test SET id=10 WHERE id=1;

 

Page 37: Procedury i funkcje

37

mysql> UPDATE test SET id=20 WHERE id=2;

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction---------------------------------- przekroczony czas oczekiwania –---------------------------------

mysql> UPDATE test SET id=20 WHERE id=2;

Query OK, 1 row affected (21.44 sec)Rows matched: 1 Changed: 1 Warnings: 0

mysql> UPDATE test SET id=10 WHERE id=1;

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction---------------------------------- przekroczony czas oczekiwania ----------------------------------

mysql> SELECT * FROM test;+----+| id |+----+| 10 || 20 |+----+

Page 38: Procedury i funkcje

38

mysql> SELECT * FROM test;

+----+| id |+----+| 1 || 2 |+----+

mysql> COMMIT;Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM test;+----+| id |+----+| 1 || 2 |+----+mysql> COMMIT;Query OK, 0 rows affected (0.00 sec)mysql> SELECT * FROM test;+----+| id |+----+| 10 || 20 |+----+

Page 39: Procedury i funkcje

39

Informacje o statusie tabeli i jej powiązaniach:

mysql> show table status like 'personel'\G*************************** 1. row *************************** Name: personel Engine: InnoDB Version: 10 Row_format: Compact Rows: 17 Avg_row_length: 963 Data_length: 16384Max_data_length: 0 Index_length: 16384 Data_free: 0 Auto_increment: NULL Create_time: 2008-04-01 12:36:44 Update_time: NULL Check_time: NULL Collation: utf8_polish_ci Checksum: NULL Create_options: Comment: InnoDB free: 3072 kB; (`biuronr`) REFER

`biuro/biuro`(`biuronr`) ON UPDATE CASCAD

Page 40: Procedury i funkcje

40

INFORMATION_SCHEMA:

Zapewnia dostęp do metadanych bazy danych.

Metadane to dane o danych (definicja struktury danych), takie jak nazwa bazy danych lub tabeli, typ danych kolumny lub przywileje dostępu. Nazywany czasami słownikiem danych lub katalogiem systemowym.

INFORMATION_SCHEMA to ''baza informacyjna'', gdzie magazynuje się informacje o wszystkich bazach danych, które serwer MySQL utrzymuje. Zawiera kilka tabel (tymczasowych), które są tylko do odczytu.

Każdy użytkownik MySQL ma prawo dostępu do tych tabel, ale tylko do wierszy związanych z obiektami, do których użytkownik posiada właściwe przywileje dostępu.

Struktura tabel INFORMATION_SCHEMA stosuje się do standardu ANSI/ISO SQL:2003 część 11 ''Schematy''.

Jest dostępny od wersji MySQL 5.0.2.

Page 41: Procedury i funkcje

41

mysql> show tables;+---------------------------------------+| Tables_in_information_schema |+---------------------------------------+| CHARACTER_SETS || COLLATIONS || COLLATION_CHARACTER_SET_APPLICABILITY || COLUMNS || COLUMN_PRIVILEGES || ENGINES || EVENTS || FILES || GLOBAL_STATUS || GLOBAL_VARIABLES || KEY_COLUMN_USAGE || PARTITIONS || PLUGINS || PROCESSLIST || REFERENTIAL_CONSTRAINTS || ROUTINES || SCHEMATA || SCHEMA_PRIVILEGES || SESSION_STATUS || SESSION_VARIABLES || STATISTICS || TABLES || TABLE_CONSTRAINTS || TABLE_PRIVILEGES || TRIGGERS || USER_PRIVILEGES || VIEWS |+---------------------------------------+27 rows in set (0.05 sec)

Pełna lista tabel Information_schema:

Page 42: Procedury i funkcje

42

Wybrane informacje o tabelach:

mysql> SELECT table_schema, table_name, table_type FROM information_schema.tables;+--------------------+---------------------------------------+-------------+| table_schema | table_name | table_type |+--------------------+---------------------------------------+-------------+| information_schema | CHARACTER_SETS | SYSTEM VIEW || information_schema | COLLATIONS | SYSTEM VIEW || information_schema | COLLATION_CHARACTER_SET_APPLICABILITY | SYSTEM VIEW || information_schema | COLUMNS | SYSTEM VIEW || information_schema | COLUMN_PRIVILEGES | SYSTEM VIEW || information_schema | ENGINES | SYSTEM VIEW || information_schema | EVENTS | SYSTEM VIEW || information_schema | FILES | SYSTEM VIEW || information_schema | GLOBAL_STATUS | SYSTEM VIEW || information_schema | GLOBAL_VARIABLES | SYSTEM VIEW || information_schema | KEY_COLUMN_USAGE | SYSTEM VIEW || information_schema | PARTITIONS | SYSTEM VIEW || information_schema | PLUGINS | SYSTEM VIEW || information_schema | PROCESSLIST | SYSTEM VIEW || information_schema | REFERENTIAL_CONSTRAINTS | SYSTEM VIEW || information_schema | ROUTINES | SYSTEM VIEW || information_schema | SCHEMATA | SYSTEM VIEW || information_schema | SCHEMA_PRIVILEGES | SYSTEM VIEW || information_schema | SESSION_STATUS | SYSTEM VIEW |...

Page 43: Procedury i funkcje

43

| information_schema | SESSION_VARIABLES | SYSTEM VIEW || information_schema | STATISTICS | SYSTEM VIEW || information_schema | TABLES | SYSTEM VIEW || information_schema | TABLE_CONSTRAINTS | SYSTEM VIEW || information_schema | TABLE_PRIVILEGES | SYSTEM VIEW || information_schema | TRIGGERS | SYSTEM VIEW || information_schema | USER_PRIVILEGES | SYSTEM VIEW || information_schema | VIEWS | SYSTEM VIEW || biuro | _10_dyrektorzy | VIEW || biuro | _10_full | VIEW || biuro | _11_biuro_b003 | VIEW || biuro | biuro | BASE TABLE || biuro | biuro2 | BASE TABLE || biuro | klient | BASE TABLE || biuro | nieruchomosc | BASE TABLE || biuro | nieruchomosc2 | BASE TABLE || biuro | personel | BASE TABLE || biuro | rejestracja | BASE TABLE || biuro | test1 | BASE TABLE || biuro | test2 | BASE TABLE || biuro | test3 | BASE TABLE || biuro | test4 | BASE TABLE || biuro | wizyta | BASE TABLE || biuro | wlasciciel | BASE TABLE || biuro | wynajecie | BASE TABLE |...

Page 44: Procedury i funkcje

44

| mysql | columns_priv | BASE TABLE || mysql | db | BASE TABLE || mysql | event | BASE TABLE || mysql | func | BASE TABLE || mysql | general_log | BASE TABLE || mysql | help_category | BASE TABLE || mysql | help_keyword | BASE TABLE || mysql | help_relation | BASE TABLE || mysql | help_topic | BASE TABLE || mysql | host | BASE TABLE || mysql | plugin | BASE TABLE || mysql | proc | BASE TABLE || mysql | procs_priv | BASE TABLE || mysql | slow_log | BASE TABLE || mysql | tables_priv | BASE TABLE || mysql | time_zone | BASE TABLE || mysql | time_zone_leap_second | BASE TABLE || mysql | time_zone_name | BASE TABLE || mysql | time_zone_transition | BASE TABLE || mysql | time_zone_transition_type | BASE TABLE || mysql | user | BASE TABLE || mysql | user_info | BASE TABLE |+--------------------+--------------------------------------+-------------+

Page 45: Procedury i funkcje

45

Informacje z komentarzami dla tabel bazy biuro:mysql> SELECT table_schema, table_name, table_comment FROM information_schema.tables WHERE TABLE_SCHEMA='biuro';+--------------+----------------+---------------+| TABLE_SCHEMA | TABLE_NAME | TABLE_COMMENT |+--------------+----------------+---------------+| biuro | _10_dyrektorzy | VIEW || biuro | _10_full | VIEW || biuro | _11_biuro_b003 | VIEW || biuro | biuro | || biuro | biuro2 | || biuro | klient | || biuro | nieruchomosc | || biuro | nieruchomosc2 | || biuro | personel | || biuro | rejestracja | || biuro | test1 | || biuro | test2 | || biuro | test3 | || biuro | test4 | || biuro | v1 | VIEW || biuro | v2 | VIEW || biuro | v3 | VIEW || biuro | wizyta | || biuro | wlasciciel | || biuro | wynajecie | |+--------------+----------------+---------------+20 rows in set (0.03 sec)

Page 46: Procedury i funkcje

46

Informacje z komentarzami dla tabel bazy mysql:

mysql> select TABLE_SCHEMA, TABLE_NAME, TABLE_COMMENT from information_schema.tables WHERE TABLE_SCHEMA='mysql';+-------------+---------------------------+------------------------------+| TABLE_SCHEMA| TABLE_NAME | TABLE_COMMENT |+-------------+---------------------------+------------------------------+| mysql | columns_priv | Column privileges || mysql | db | Database privileges || mysql | func | User defined functions || mysql | help_category | help categories || mysql | help_keyword | help keywords || mysql | help_relation | keyword-topic relation || mysql | help_topic | help topics || mysql | host | Host privileges; Merged with

database privileges || mysql | proc | Stored Procedures || mysql | procs_priv | Procedure privileges || mysql | tables_priv | Table privileges || mysql | time_zone | Time zones || mysql | time_zone_leap_second | Leap seconds information for

time zones || mysql | time_zone_name | Time zone names || mysql | time_zone_transition | Time zone transitions || mysql | time_zone_transition_type | Time zone transition types || mysql | user | Users and global privileges |+-------------+---------------------------+------------------------------+

Page 47: Procedury i funkcje

47

mysql> SELECT * FROM information_schema.tables WHERE TABLE_SCHEMA='biuro' AND TABLE_NAME='personel'\G*************************** 1. row *************************** TABLE_CATALOG: NULL TABLE_SCHEMA: biuro TABLE_NAME: personel TABLE_TYPE: BASE TABLE ENGINE: InnoDB VERSION: 10 ROW_FORMAT: Compact TABLE_ROWS: 17 AVG_ROW_LENGTH: 963 DATA_LENGTH: 16384MAX_DATA_LENGTH: 0 INDEX_LENGTH: 16384 DATA_FREE: 0 AUTO_INCREMENT: NULL CREATE_TIME: 2008-04-01 12:36:44 UPDATE_TIME: NULL CHECK_TIME: NULLTABLE_COLLATION: utf8_polish_ci CHECKSUM: NULL CREATE_OPTIONS: TABLE_COMMENT: InnoDB free: 3072 kB; (`biuronr`) REFER`

biuro/biuro`(`biuronr`) ON UPDATE CASCAD

Wszystkie informacje dla tabeli personel bazy biuro:

Page 48: Procedury i funkcje

48

Informacje o schematach :

mysql> SELECT catalog_name, schema_name, default_character_set_name, default_collation_name FROM information_schema.schemata;

+--------------+-------------------+---------------------------+-----------------------+| catalog_name | schema_name | default_character_set_name| default_collation_name|+--------------+-------------------+---------------------------+-----------------------+| NULL | information_schema| utf8 | utf8_general_ci || NULL | biuro | utf8 | utf8_polish_ci || NULL | mysql | utf8 | utf8_general_ci || NULL | szkola | utf8 | utf8_polish_ci |+--------------+-------------------+---------------------------+-----------------------+4 rows in set (0.02 sec)

Page 49: Procedury i funkcje

49

mysql> SELECT * FROM information_schema.columns WHERE TABLE_SCHEMA='biuro' AND TABLE_NAME='personel' AND COLUMN_NAME IN ('personelnr','plec')\G*************************** 1. row *************************** TABLE_CATALOG: NULL TABLE_SCHEMA: biuro TABLE_NAME: personel COLUMN_NAME: personelNr ORDINAL_POSITION: 1 COLUMN_DEFAULT: NULL IS_NULLABLE: NO DATA_TYPE: varcharCHARACTER_MAXIMUM_LENGTH: 4 CHARACTER_OCTET_LENGTH: 12 NUMERIC_PRECISION: NULL NUMERIC_SCALE: NULL CHARACTER_SET_NAME: utf8 COLLATION_NAME: utf8_polish_ci COLUMN_TYPE: varchar(4) COLUMN_KEY: PRI EXTRA: PRIVILEGES: select,insert,update,references COLUMN_COMMENT:

Rozszerzone informacje o kolumnach:

Page 50: Procedury i funkcje

50

Cd.

*************************** 2. row *************************** TABLE_CATALOG: NULL TABLE_SCHEMA: biuro TABLE_NAME: personel COLUMN_NAME: plec ORDINAL_POSITION: 5 COLUMN_DEFAULT: NULL IS_NULLABLE: NO DATA_TYPE: enumCHARACTER_MAXIMUM_LENGTH: 1 CHARACTER_OCTET_LENGTH: 3 NUMERIC_PRECISION: NULL NUMERIC_SCALE: NULL CHARACTER_SET_NAME: utf8 COLLATION_NAME: utf8_polish_ci COLUMN_TYPE: enum('K','M') COLUMN_KEY: EXTRA: PRIVILEGES: select,insert,update,references COLUMN_COMMENT:

Page 51: Procedury i funkcje

51

Informacje o używanych kluczach:

mysql> SELECT * FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA='biuro' AND TABLE_NAME='personel'\G************************** 1. row ************************** CONSTRAINT_CATALOG: NULL CONSTRAINT_SCHEMA: biuro CONSTRAINT_NAME: PRIMARY TABLE_CATALOG: NULL TABLE_SCHEMA: biuro TABLE_NAME: personel COLUMN_NAME: personelNr ORDINAL_POSITION: 1POSITION_IN_UNIQUE_CONSTRAINT: NULL REFERENCED_TABLE_SCHEMA: NULL REFERENCED_TABLE_NAME: NULL REFERENCED_COLUMN_NAME: NULL

Page 52: Procedury i funkcje

52

cd:

************************** 2. row ************************** CONSTRAINT_CATALOG: NULL CONSTRAINT_SCHEMA: biuro CONSTRAINT_NAME: biuroNr TABLE_CATALOG: NULL TABLE_SCHEMA: biuro TABLE_NAME: personel COLUMN_NAME: biuroNr ORDINAL_POSITION: 1POSITION_IN_UNIQUE_CONSTRAINT: 1 REFERENCED_TABLE_SCHEMA: biuro REFERENCED_TABLE_NAME: biuro REFERENCED_COLUMN_NAME: biuroNr2 rows in set (0.02 sec)

Page 53: Procedury i funkcje

53

Informacje o więzach (ograniczeniach) tabel:

mysql> SELECT * FROM information_schema.table_constraints WHERE TABLE_SCHEMA='biuro' AND

TABLE_NAME='personel'\G************************** 1. row **************************CONSTRAINT_CATALOG: NULL CONSTRAINT_SCHEMA: biuro CONSTRAINT_NAME: PRIMARY TABLE_SCHEMA: biuro TABLE_NAME: personel CONSTRAINT_TYPE: PRIMARY KEY************************** 2. row **************************CONSTRAINT_CATALOG: NULL CONSTRAINT_SCHEMA: biuro CONSTRAINT_NAME: biuroNr TABLE_SCHEMA: biuro TABLE_NAME: personel CONSTRAINT_TYPE: FOREIGN KEY

2 rows in set (0.02 sec)

Page 54: Procedury i funkcje

54

Informacje o indeksach:

mysql> SELECT * FROM information_schema.statistics WHERE TABLE_SCHEMA='biuro' AND TABLE_NAME='personel'\G************************** 1. row **************************TABLE_CATALOG: NULL TABLE_SCHEMA: biuro TABLE_NAME: personel NON_UNIQUE: 0 INDEX_SCHEMA: biuro INDEX_NAME: PRIMARY SEQ_IN_INDEX: 1 COLUMN_NAME: personelNr COLLATION: A CARDINALITY: 17 SUB_PART: NULL PACKED: NULL NULLABLE: INDEX_TYPE: BTREE COMMENT:

Page 55: Procedury i funkcje

55

************************** 2. row **************************TABLE_CATALOG: NULL TABLE_SCHEMA: biuro TABLE_NAME: personel NON_UNIQUE: 1 INDEX_SCHEMA: biuro INDEX_NAME: biuroNr SEQ_IN_INDEX: 1 COLUMN_NAME: biuroNr COLLATION: A CARDINALITY: 17 SUB_PART: NULL PACKED: NULL NULLABLE: INDEX_TYPE: BTREE COMMENT:

2 rows in set (0.01 sec)

Cd.