BD-1st-2.4-lab8.tresc-1.1-Slajd4

Z Studia Informatyczne
Wersja z dnia 09:17, 9 sie 2006 autorstwa PKrzyzagorski (dyskusja | edycje)
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)
Przejdź do nawigacjiPrzejdź do wyszukiwania

Sekwencje

Sekwencje


Na poprzednim ćwiczeniu pokazaliśmy Państwu sposób generowania nowych kluczy, który polegał na tym, iż znajdowano za pomocą podzapytania w poleceniu INSERT największą wartość klucza w tabeli i zwiększano go o jakąś stałą. Niestety, sposób ten jest poprawny jedynie w sytuacji, gdy w danym momencie do tabeli wstawia dane tylko jeden użytkownik. Rozważmy sytuację, w której dwóch użytkowników próbuje równocześnie wstawić nową krotkę. Obu użytkowników równocześnie znajduje maksymalną wartość klucza w tabeli i zwiększa go o ustaloną wcześniej liczbę. Ponieważ obydwu tych użytkowników widzi takie same dane w relacji, oblicza taki sam klucz podstawowy dla nowej krotki. Ponieważ ograniczenie integralnościowe „klucz podstawowy” zabrania wstawiania dwóch krotek o takich samych wartościach na atrybutach wchodzących w skład klucza podstawowego, tylko jednemu z tych użytkowników uda się wstawić krotkę. Dla drugiego użytkownika operacja wstawienia danych zakończy się błędem. Użytkownik, któremu operacja się nie udała, może oczywiście próbować ponowić operację zapisania krotki do relacji, ale zawsze istnieje możliwość, że pojawi się nowy użytkownik, z którym ten pierwszy znowu przegra. W ogólności jeden użytkownik może nigdy nie być w stanie wstawić krotki, gdyż zawsze jakiś inny użytkownik z nim będzie wygrywał i wstawiał krotkę o takim samym kluczu pierwszy.

Aby rozwiązać wyżej opisany problem, można użyć sekwencji. Sekwencja jest obiektem przechowującym pewną wartość liczbową. Każda próba odczytania tej wartości powoduje wpierw zwiększenie jej o ustaloną wielkość. Zwiększenie i odczytanie tej wartości odbywa się w sposób atomowy, dzięki czemu nie jest możliwe, aby jakikolwiek użytkownik korzystający z SZBD w danym momencie odczytał taką samą wartość z sekwencji. Odczytane z sekwencji wartości mogą następnie zostać wykorzystane jako wartość klucza podstawowego nowych krotek, dzięki czemu problem równoczesnej pracy kilku użytkowników jest rozwiązany.

W ogólności problem generowania nowych wartości klucza jest rozwiązywany w różny sposób w różnych SZBD. W Oracle, DB2 i PostgreSQL można zastosować sekwencje. Prócz sekwencji, w DB2 można zastosować również tzw. atrybuty tożsamościowe (ang. identity columns ). Są to atrybuty, do których automatycznie wstawiana jest nowa wartość przy wstawianiu nowej krotki do relacji. W PostgreSQL istnieje również podobne rozwiązanie. Jest nim „typ danych” o nazwie SERIAL, którego użycie jest równoważne utworzeniu sekwencji i domyślnemu zapisywaniu do odpowiedniego atrybutu wartości odczytanej z sekwencji. W MySQL również istnieje rozwiązanie analogiczne do atrybutów tożsamościowych z DB2, ale jest to realizowane poprzez dopisanie słowa kluczowego AUTO_INCREMENT w definicji atrybutu, w sposób podobny do definicji ograniczenia atrybutu.

Na tym ćwiczeniu przedstawiono składnię poleceń dotyczących sekwencji używaną w Oracle SZBD, jednak składnia tych poleceń jest prawie identyczna dla wszystkich SZBD, w których można korzystać z sekwencji. Przykład (1) pokazuje ogólną składnię polecenia CREATE SEQUENCE tworzącego sekwencje w bazie danych. Polecenie rozpoczyna się od słów kluczowych CREATE SEQUENCE, za którymi podaje się nazwę sekwencji, a następnie klauzule pozwalające określić: pierwszą wartość licznika w sekwencji (START WITH), o ile ma być zwiększany licznik przy każdym odczycie (INCREMENT BY), maksymalną i minimalną wartość licznika, lub ich brak (MAXVALUE, NOMAXVALUE, MINVALUE, NOMINVALUE). Przykład (2) pokazuje polecenie CREATE SEQUENCE tworzące sekwencję o nazwie SEQ_ZESP, której pierwszą zwracaną wartością będzie 60, a każda kolejna wartość będzie większa o 10 od poprzedniej. Można wpływać na parametry sekwencji za pomocą polecenia ALTER SEQUENCE, którego ogólną składnię przedstawiono na przykładzie (3). Składnia polecenia jest prawie identyczna z poleceniem CREATE SEQUENCE. Pierwszą różnicą jest zastąpienie słowa kluczowego CREATE słowem ALTER, a drugą jest to, iż nie można modyfikować początkowej wartości sekwencji. Wszystkie pozostałe parametry można zmieniać. Przykład (4) pokazuje polecenie ALTER SEQUENCE modyfikujące utworzoną wcześniej sekwencję SEQ_ZESP tak, aby kolejne wartości zwracane przez sekwencję były tylko o jeden większe od poprzednich. Sekwencję można usunąć za pomocą polecenia DROP SEQUENCE, którego jedynym parametrem jest nazwa usuwanej sekwencji (5). Przykład (6) pokazuje jak można usunąć sekwencję o nazwie SEQ_ZESP.


<< Poprzedni slajd | Spis treści | Następny slajd >>