Procedury i funkcje Tworzenie: CREATE

Slides:



Advertisements
Podobne prezentacje
Indeksy w bazie danych Oracle
Advertisements

Bazy danych II Transakcje Piotr Górczyński 25/08/2001.
Wprowadzenie do informatyki Wykład 6
Procedury wyzwalane Procedura wyzwalana (ang. trigger) - stanowi kod użytkownika przechowywany wewnątrz bazy i uruchamiany w określonych sytuacjach np.
Skrypty, procedury przechowywane i wyzwalane
POWIAT MYŚLENICKI Tytuł Projektu: Poprawa płynności ruchu w centrum Myślenic poprzez przebudowę skrzyżowań dróg powiatowych K 1935 i K 1967na rondo.
SQL – Strukturalny język zapytań
Bazy danych II Instrukcja SELECT Piotr Górczyński 25/08/2001.
Język SQL Część II.
Domy Na Wodzie - metoda na wlasne M
Bazy danych 10. Z łą czenia i transakcje P. F. Góra semestr letni 2004/05.
Bazy danych 9. SQL — Różności P. F. Góra semestr letni 2004/05
Bazy danych 8. SQL podstawy P. F. Góra semestr letni 2004/05.
Bazy danych II Instrukcja INSERT Piotr Górczyński 25/08/2001.
(c) 1999, Instytut Informatyki Politechniki Poznańskiej Rozdział 7: Relacje i ograniczenia integralnościowe Język definiowania danych - DDL (Data Definition.
Metody autoryzacji użytkowników wymaga integracji z systemem operacyjnym nie wymaga logowania mała pewność mechanizmu wymaga logowania duża pewność mechanizmu.
Bezpieczeństwo Procedury składowane Funkcje i Wyzwalacze
ZSBD PL/SQL CZĘŚĆ 3 Wykład 5 Prowadzący: dr Paweł Drozda.
Język definicji danych (Data Definition Language)
Język definicji danych (Data Definition Language)
WYZWALACZE (TRIGGERY) Wyzwalacz jest specjalnym rodzajem procedury składowanej, która może być wykonana w odpowiedzi na jedną z trzech sytuacji: UPDATE.
Wymagania do projektu i realizacji baz danych:
POWTÓRZENIE Techniki zbierania informacji : Analiza dokumentacji
POWTÓRZENIE definicja danych; opcje definicji kolumn;
POWTÓRZENIE Główne elementy składni SQL: Zasady ogólne
POWTÓRZENIE Kontrola integralności danych; dane wymagane;
Język SQL (Structured Query Language) DDL (Data Definition Language)
Bazy Danych II prowadzący: mgr inż. Leszek Siwik
SQL – Structured Query Language (3)
Ogólnopolski Konkurs Wiedzy Biblijnej Analiza wyników IV i V edycji Michał M. Stępień
MySQL – ODBC - ACCESS.
Instrukcje: CREATE, INSERT, UPDATE, DELETE, DROP
SQL – Structured Query Language (1)
Użytkownicy i przywileje Sesja - przykład Błędy Komunikacja międzyskryptowa Wykład 83PD Technologie internetowe.
KOLEKTOR ZASOBNIK 2 ZASOBNIK 1 POMPA P2 POMPA P1 30°C Zasada działanie instalacji solarnej.
SQL - Structured Query Language
1. Pomyśl sobie liczbę dwucyfrową (Na przykład: 62)
Jak zacząć w MS SQL? USE master; GO IF DB_ID (Nbaza') IS NOT NULL DROP DATABASE baza; GO CREATE DATABASE baza; GO USE baza; GO.
Analiza matury 2013 Opracowała Bernardeta Wójtowicz.
Badanie kwartalne BO 2.3 SPO RZL Wybrane wyniki porównawcze edycji I- VII Badanie kwartalne Beneficjentów Ostatecznych Działania 2.3 SPO RZL – schemat.
Komendy SQL do pracy z tabelami i bazami
Bazy Danych Wykład 7 Wojciech St. Mościbrodzki
Wstępna analiza egzaminu gimnazjalnego.
EcoCondens Kompakt BBK 7-22 E.
EcoCondens BBS 2,9-28 E.
PL/SQL – dalsza wędrówka
SQL – część II.
User experience studio Użyteczna biblioteka Teraźniejszość i przyszłość informacji naukowej.
1 SBD, L.Banachowski Podstawy SQL - języka relacyjnych i obiektowo-relacyjnych baz danych (SQL2, SQL'1999, Oracle) Powtórzenie wyk ł adu 3.
Testogranie TESTOGRANIE Bogdana Berezy.
Jak Jaś parował skarpetki Andrzej Majkowski 1 informatyka +
Dr hab. Renata Babińska- Górecka
1 SBD, L.Banachowski Zaawansowane cechy SQL Powtórzenie wyk ł adu 5.
Autor: Damian Urbańczyk
Współrzędnościowe maszyny pomiarowe
Elementy geometryczne i relacje
Strategia pomiaru.
1 SBD, L.Banachowski Oprogramowanie strony serwera cz. 1 Powtórzenie wyk ł adu 6.
Komendy SQL do pracy z danymi
Wykład 3 Prowadzący: dr Paweł Drozda. Użytkownik bazy danych – osoba lub aplikacja, mająca dostęp do części danych zgromadzonych w bazie Uprawnienia –
ASP.NET Dostęp do bazy danych z poziomu kodu Elżbieta Mrówka-Matejewska.
Oracle Data Modeler (4.1). Aplikacja Wymagania biznesowe Tworzenie systemu informacyjnego Procesy Informacje Analiza Projektowanie Browser: Hollywood.
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.
1 Instrukcja SELECT : SELECT[DISTINCT  ALL] {*  [wyrażenie_kolumnowe [AS nowa_nazwa]],[…]} FROMNazwaTabeli [alias],[...] [WHEREwarunek_selekcji_wierszy]
Wybieranie wierszy: 1 Warunek WHERE Rodzaje warunków: - liczbowe - liczbowe z zakresu - znakowe.
1 Procedury i funkcje CREATE PROCEDURE nazwa ([proc_parameter[,...]]) [characteristic...] routine_body CREATE FUNCTION nazwa ([func_parameter[,...]]) RETURNS.
Widoki (views) - Perspektywy:
Ćwiczenie 1 Podaj liczbę wizyt w nieruchomościach w kolejnych dniach poprzedniego miesiąca kalendarzowego: SELECT data_wizyty, COUNT(*) AS liczba FROM.
Technologie Informacyjne Bazy danych
Własności relacji: Baza danych jest zbiorem relacji, o następujących własnościach: każda relacja w bazie danych jest jednoznacznie określona przez swoją.
Zapis prezentacji:

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

Prosty przykład: CREATE PROCEDURE przecena (IN nazwa varchar (64)) UPDATE nieruchomosc SET czynsz = czynsz*1.2 WHERE 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)

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)

Schemat bazy Biuro Nieruchomości:

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 personel SET pensja = pensja+ile WHERE stanowisko = jaki; CALL podwyzka(50, 'asystent');

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 rchar CHAR(11); CASE r WHEN 1 THEN SET rchar='1992-01-01'; WHEN 2 THEN SET rchar='1991-01-01'; WHEN 3 THEN SET rchar='1990-01-01'; ELSE SELECT 'ERROR - ZLY ROK'; END CASE;

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 rchar - INTERVAL rand()*365+1 DAY),'K', (SELECT id_klasy FROM Klasy WHERE rok=r AND klasa=kl)); SET dz=dz+1; END WHILE;

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 rchar - 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 ;

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') ;

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') ;

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);

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)

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

Wyzwalacze: CREATE TRIGGER nazwa trigger_time trigger_event ON 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

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

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); mysql> CREATE TABLE test4( -> a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, -> b4 INT DEFAULT 0 -> );

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 ;

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)

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)

Aktywacja wyzwalacza: 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

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

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)

Cechy MySQL w wersjach: Unions 4.0 Subqueries 4.1 R-trees 4.1 (dla tabeli MyISAM) Procedury i funkcje 5.0 Views (perspektywy) Cursors 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

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

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.

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.

MySQL może pracować w dwóch trybach 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.

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; | 10 | | 20 | mysql> COMMIT;

Ponowny powrót do trybu autocommit spowoduje polecenie: 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 |

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> DELETE FROM test;

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

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> START TRANSACTION; mysql> UPDATE test SET id=10 WHERE id=1; mysql> UPDATE test SET id=20 WHERE id=2;

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 ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction mysql>

mysql> SELECT * FROM test; +----+ | id | | 10 | | 20 | | 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) | 10 | | 20 |

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> START TRANSACTION; mysql> UPDATE test SET id=10 WHERE id=1;

mysql> UPDATE test SET id=20 WHERE id=2; ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction --------------------------------- - przekroczony czas oczekiwania – Query OK, 1 row affected (21.44 sec)Rows matched: 1 Changed: 1 Warnings: 0 mysql> UPDATE test SET id=10 WHERE id=1; - przekroczony czas oczekiwania - mysql> SELECT * FROM test; +----+ | id | | 10 | | 20 |

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

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: 16384 Max_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

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.

Pełna lista tabel Information_schema: 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)

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 | ...

| 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 | ...

| 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 | +--------------------+--------------------------------------+-------------+

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)

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 |

Wszystkie informacje dla tabeli personel bazy biuro: 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: 16384 MAX_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 TABLE_COLLATION: utf8_polish_ci CHECKSUM: NULL CREATE_OPTIONS: TABLE_COMMENT: InnoDB free: 3072 kB; (`biuronr`) REFER` biuro/biuro`(`biuronr`) ON UPDATE CASCAD

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)

Rozszerzone informacje o kolumnach: 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: varchar CHARACTER_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:

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: enum CHARACTER_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:

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: 1 POSITION_IN_UNIQUE_CONSTRAINT: NULL REFERENCED_TABLE_SCHEMA: NULL REFERENCED_TABLE_NAME: NULL REFERENCED_COLUMN_NAME: NULL

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: 1 POSITION_IN_UNIQUE_CONSTRAINT: 1 REFERENCED_TABLE_SCHEMA: biuro REFERENCED_TABLE_NAME: biuro REFERENCED_COLUMN_NAME: biuroNr 2 rows in set (0.02 sec)

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_NAME: biuroNr CONSTRAINT_TYPE: FOREIGN KEY 2 rows in set (0.02 sec)

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:

Cd. ************************** 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)

Przykładowe wyszukiwanie danych użytkownika „Biuro”: Podaj informacje o biurach w danym mieście; Podaj liczbę wszystkich biur w danym mieście. Podaj nazwiska, stanowiska oraz wysokości pensji pracowników zatrudnionych w danym biurze. Wynik uporządkuj według nazwisk. Podaj całkowitą liczbę pracowników firmy oraz ich sumaryczną pensje. Podaj liczbę pracowników zatrudnionych na poszczególnych stanowiskach we wszystkich biurach w Białymstoku. Podaj nazwiska wszystkich dyrektorów biur w kolejności wyznaczonej adresami biur. Podaj nazwiska wszystkich pracowników podległych określonemu dyrektorowi. Podaj numery, adresy, typy i wysokość czynszu dla wszystkich nieruchomości z Białegostoku. Wynik uporządkuj według czynszu. Podaj informacje o wszystkich nieruchomościach nadzorowanych przez określonego pracownika. Podaj liczbę nieruchomości nadzorowanych przez każdego pracownika w każdym z biur.

Podaj informacje o nieruchomościach oferowanych do wynajęcia przez właścicieli instytucjonalnych zarejestrowanych w danym biurze. Podaj całkowitą liczbę nieruchomości każdego typu zarejestrowanych w każdym z biur. Podaj informacje o wszystkich właścicielach prywatnych oferujących do wynajęcia więcej niż jedną nieruchomość. Podaj informacje o wszystkich mieszkaniach w Augustowie, w których są przynajmniej trzy pokoje, a czynsz nie przekracza 350 złotych. Podaj numery, nazwiska i numery telefonów oraz preferowany rodzaj nieruchomości dla wszystkich klientów danego biura. Znajdź nieruchomości, które były ogłaszane w prasie częściej, niż wynosi przeciętna liczba ogłoszeń dotyczących jednej nieruchomości. Podaj informacje o wynajęciach nieruchomości zarejestrowanych w danym biurze, których termin końcowy upłynie w następnym miesiącu. Podaj całkowitą liczbę umów najmu zawartych w biurach w Łomży na okres krótszy niż jeden rok. Podaj najwyższą dzienną stawkę za wynajęcie nieruchomości w każdym z biur. Wynik uporządkuj według numerów biur.

11. Podaj informacje o nieruchomościach oferowanych do wynajęcia przez właścicieli zarejestrowanych w danym biurze: SELECT wlascicielnr,nieruchomoscnr, CONCAT(kod,' ',miasto,' ',ulica)AS adres, typ,czynsz FROM nieruchomosc WHERE biuronr = 'B003'; mysql> SELECT wlascicielnr, nieruchomoscnr, CONCAT(kod, ' ', miasto, ' ', ulica) AS adres, typ, czynsz -> FROM nieruchomosc -> WHERE biuronr = 'B003'; +--------------+----------------+---------------------------+------------+--------+ | wlascicielnr | nieruchomoscnr | adres | typ | czynsz | | CO93 | B16 | 15-900 Białystok Nowa 5 | mieszkanie | 495 | | CO93 | B17 | 15-900 Białystok Mała 2 | mieszkanie | 412 | | CO40 | B18 | 15-900 Białystok Leśna 6 | mieszkanie | 385 | | CO87 | B21 | 15-900 Białystok Dobra 18 | dom | 660 |

12. Podaj całkowitą liczbę nieruchomości każdego typu zarejestrowanych w każdym z biur: SELECT biuronr, typ, COUNT(*) FROM nieruchomosc GROUP BY biuronr, typ; mysql> SELECT biuronr, typ, COUNT(*) -> FROM nieruchomosc -> GROUP BY biuronr, typ; +---------+------------+----------+ | biuronr | typ | COUNT(*) | | B003 | dom | 1 | | B003 | mieszkanie | 3 | | B004 | dom | 1 | | B005 | mieszkanie | 1 |

13. Podaj informacje o wszystkich właścicielach prywatnych oferujących do wynajęcia więcej niż jedną nieruchomość: SELECT biuronr, typ, COUNT(*) FROM nieruchomosc GROUP BY biuronr, typ;

14. Podaj informacje o wszystkich mieszkaniach w Augustowie, w których są przynajmniej trzy pokoje, a czynsz nie przekracza 350 złotych: SELECT biuronr, typ, COUNT(*) FROM nieruchomosc GROUP BY biuronr, typ;

15. Podaj numery, nazwiska i numery telefonów oraz preferowany rodzaj nieruchomości dla wszystkich klientów danego biura: SELECT biuronr, typ, COUNT(*) FROM nieruchomosc GROUP BY biuronr, typ;

17. Podaj informacje o wynajęciach nieruchomości zarejestrowanych w danym biurze, których termin końcowy upłynie w następnym miesiącu: SELECT biuronr, typ, COUNT(*) FROM nieruchomosc GROUP BY biuronr, typ;

18. Podaj całkowitą liczbę umów najmu zawartych w biurach w Łomży na okres krótszy niż jeden rok: SELECT biuronr, typ, COUNT(*) FROM nieruchomosc GROUP BY biuronr, typ;

19. Podaj najwyższą dzienną stawkę za wynajęcie nieruchomości w każdym z biur. Wynik uporządkuj według numerów biur: SELECT biuronr, typ, COUNT(*) FROM nieruchomosc GROUP BY biuronr, typ;

Przykładowe wyszukiwanie danych użytkownika „Personel”: Podaj wszystkich podwładnych danego kierownika z danego biura; Podaj szczegółowe informacje o wszystkich asystentach, uporządkowane według nazwiska i biura. Podaj szczegółowe informacje o nieruchomościach (obejmujące także kaucje za wynajęcie), które można uzyskać w biurze, wraz z informacjami o właścicielu. Podaj szczegółowe informacje o nieruchomościach nadzorowanych przez wskazanego pracownika z danego biura. Podaj dane klientów zarejestrowanych w danym biurze oraz dla każdego klienta dane pracownika, który go zarejestrował. Podaj dane nieruchomości znajdujących się w Łomży, dla których miesięczny czynsz nie przekracza 450 złotych.

Podaj uwagi zgłaszane przez klientów odwiedzających daną nieruchomość. Podaj nazwiska i numery telefonów klientów, którzy oglądali nieruchomość, ale nie zgłosili żadnych uwag. Podaj szczegółowe informacje dotyczące wynajęcia określonej nieruchomości przez określonego klienta. Podaj informacje o wynajęciach nieruchomości, których termin końcowy upłynie w następnym miesiącu. Podaj informacje o nieruchomościach, których nie udało się wynająć przez ponad trzy miesiące. Podaj listę klientów, których wymagania odpowiadają określonej nieruchomości.

Typ wyliczeniowy pola: Kolumna ustawiona jako ENUM('jeden','dwa','trzy') może przyjmować którąkolwiek z poniższych wartości, gdzie przedstawiono również indeksy dla każdej wartości: Value Index NULL ' ' 'jeden' 1 'dwa' 2 'trzy' 3 Typ wyliczeniowy może mieć maksymalnie 65 535 elementów.