Выбрать главу

s_ te s t. n e x tv a l и s_ te s t. c u rrv a l; обратите внимание, что оба значения

равны 2 :

□ SELECT s_test.nextval, s_test.currval

FROM dual;

NEXTVAL CURRVAL

2 2

Обращение к s _ te s t. n e x tv a l дает следующее значение из последовательности,

которое равно 2 ; в этот момент s _ te s t .c u r r v a l также равно 2 .

В следующем примере инициализируется последовательность s_ te s t2

путем выборки s_ te s t2 . nex tva l; первым значением последовательности

является 10 :

□ SELECT s_test2.nextval

FROM dual;

NEXTVAL

10

Максимальное значение для s_ te s t2 равно 20, и последовательность

была создана с опцией CYCLE. Это означает, что когда последовательность

достигнет своего максимального значения 20 , она вернется к начальному

значению 10 :

Создание таблиц, последовательностей, индексов и представлений 331

□ SELECT s_test2.nextval

FROM dual;

NEXTVAL

15

SELECT s_test2.nextval

FROM dual;

NEXTVAL

20

SELECT s_test2.nextval

FROM dual;

NEXTVAL

10

Последовательность sHest3 начинается с 10 и уменьшается до 1:

□ SELECT s_test3.nextval

FROM dual;

NEXTVAL

10

SELECT s_test3.nextval

FROM dual;

NEXTVAL

9

SELECT s_test3.nextval

FROM dual;

NEXTVAL

8

Заполнение первичного ключа с помощью последовательности

Последовательности полезны для заполнения целочисленных значений

столбца первичного ключа. Давайте посмотрим на пример. Следующее

выражение повторно создаёт таблицу о rde r_statu s2:

□ CREATE TABLE o rd e r_ s ta tu s2 (

id INTEGER

CONSTRAINT o rder_status2_pk PRIMARY KEY,

s ta tu s VARCHAR2(10),

la s t jn o d if ie d DATE DEFAULT SYSDATE

);

332 Глава 10

В следующем выражении создается последовательность s_order_

s ta tu s2 , которая будет использоваться для заполнения столбца id таблицы

о rder_status2:

□ CREATE SEQUENCE s_ o rd e r_ sta tu s2 NOCACHE;

Совет Когда последовательность используется для заполнения столбца первичного

ключа, обычно нужно использовать ключевое слово N0CACHE, чтобы избежать пропусков в

последовательности чисел. Пропуски случаются из-за того, что при выключении базы данных

кэшированные в памяти значения последовательности оказываются утерянными. Однако использование

N0CACHE уменьшает производительность. Если вы абсолютно уверены, что сможете

жить с разрывами в значениях первичного ключа, подумайте об использовании CACHE.

Следующие операторы INSERT осуществляют вставку строк в таблицу

order_status2. Значение столбца id устанавливается с помощью s_order_

status2. nextval (для первого INSERT возвращает 1, для второго INSERT - 2):

□ INSERT INTO o rd e r_ s ta tu s2 (

id , s ta tu s , la s t jn o d if ie d

) VALUES (

s_ o rd e r_ s ta tu s2 .n e x tv a l, ‘ PLACED’ , ‘ 01-JAN-2006’

);

INSERT INTO o rd e r_ s ta tu s2 (

id , s ta tu s , la s t jn o d if ie d

) VALUES (

s_ o rd e r_ s ta tu s2 .n e x tv a l, ‘ PENDING’ , 101-FEB-2006’

);

Следующий оператор SELECT выбирает строки из таблицы o rder_statu s2 .

Обратите внимание, что столбец id установлен равным первым двум значениям

(1 и 2 ) последовательности s_order_statu s2:

П SELECT * FROM o rder_sta tu s2 ;

ID STATUS LAST_M0DI

1 PLACED 01-JAN-06

2 PENDING 01-FEB-06

Изменение последовательности

Можно модифицировать последовательность с помощью оператора ALTER

SEQUENCE. Существуют некоторые ограничения на то, что именно можно

модифицировать в последовательности.

■ Нельзя изменить начальное значение последовательности.

■ Минимальное значение не может быть больше, чем текущее значение

последовательности ( c u rrv a l) .

■ Максимальное значение не может быть меньше, чем текущее значение

последовательности (c u rrv a l) .

Создание таблиц, последовательностей, индексов и представлений 333

Следующий пример модифицирует последовательность s_test, чтобы

последовательные числа увеличивались на 2 :

П ALTER SEQUENCE s_test

INCREMENT BY 2;

После модификации s_test новые значения, генерируемые последовательностью,

будут увеличиваться на 2. В предыдущем разделе последнее

сгенерированное последовательностью s_test число было равно 2 , так что

при вызове sjtest. nextval будет сгенерировано число 4. Следующий пример

получает текущее и следующее значения последовательности s_test,

используя s_test. currval и s_test. nextvaclass="underline"

□ SELECT s_test.currval

FROM dual;

CURRVAL

2

SELECT s_test.nextval

FROM dual;

NEXTVAL

4

Удаление последовательности

Для удаления последовательности используется оператор DROP SEQUENCE.

Следующий пример удаляет последовательность s_test3:

□ DROP SEQUENCE s_test3;

На этом мы завершим рассмотрение последовательностей. В следующем

разделе вы ознакомитесь с индексами.

Индексы

Когда мы ищем в книге какую-то конкретную тему, то в поисках интересующей