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;
На этом мы завершим рассмотрение последовательностей. В следующем
разделе вы ознакомитесь с индексами.
Индексы
Когда мы ищем в книге какую-то конкретную тему, то в поисках интересующей