
- •Введение
- •Прочие команды
- •Структура базы данных
- •Ключи, ограничения
- •Индексы
- •Представления
- •Процедуры и функции
- •Триггеры
- •Пользователи и сессии
- •Инструментарий скачать субд
- •Инсталляция
- •Выполнение запросов
- •Использование примеров
- •Комментарий
- •Идентификаторы
- •Обзор типов данных
- •Интервал времени
- •Литералы
- •Выражения и операции
- •Cтроковые операции
- •Алгебраические операции
- •Операции отношения
- •Логические операции и предикаты
- •Условные выражения
- •Прочие операции
- •Обзор функций
- •Математические функции
- •Строковые функции
- •Работа с датами
- •Преобразование типов
- •Функции Oracle
- •Функции PostgreSql
- •Функции MySql
- •Создание таблицы
- •Значения полей по умолчанию
- •Ключи и ограничения
- •Настройка внешнего ключа
- •Создание по выборке
- •Дополнительные параметры таблицы
- •Изменение, удаление таблицы
- •Переименование таблицы или ее столбца
- •Добавление/удаление столбца
- •Первичный ключ
- •Уникальный ключ
- •Внешний ключ
- •Безошибочное удаление таблиц
- •Добавление записей
- •Значения по умолчанию
- •Подзапросы
- •Вставка по условию
- •Обновление записей
- •Обновление подзапросом
- •Обновление по данным другой таблицы
- •Удаление записей
- •Выборка записей
- •Выборка констант
- •Выборка по столбцам таблиц
- •Синонимы (алиасы)
- •Уникальные записи
- •Выборка по условию
- •Выборка по группам
- •Соединения
- •Агрегатные функции, группировка данных
- •Операции над выборками
- •Добавление итогов
- •Нумерация записей
- •Обеспечение уникальности первичного ключа
- •Столбцы с автоинкрементом
- •Индексы
- •Представления
- •Динамический sql (dsql)
- •Процедурные операторы блоковая структура кода
- •Присвоение
- •Условный оператор
- •Оператор выбора
- •Безусловный цикл
- •Цикл с предусловием
- •Цикл по счетчику
- •Цикл по элементам
- •Операторы выхода/продолжения итерации
- •Выборка в переменные
- •Хранимые процедуры
- •Вызов процедур
- •Исключения
- •Курсоры
- •Триггеры
- •Числа прописью
- •Транзакции, конкурирующие запросы
- •Управление аккаунтами пользователи
- •Права доступа
- •Права доступа MySql
- •Права доступа PostgreSql
- •Права доступа Oracle
- •Удаление прав доступа
- •Роли PostgreSql
- •Роли Oracle
- •Роли MySql
- •Файловый вывод/ввод
- •Информация о базе данных
Обеспечение уникальности первичного ключа
В некоторых СУБД как Oracle и PostgreSQL для обеспечения уникальности первичного ключа можно воспользоваться объектом последовательность, генерирующий последовательность целых чисел. По умолчанию 1027 максимальное значение для восходящей последовательности в Oracle и 1063 в PostgreSQL. Так что одной последовательности вполне хватит на несколько таблиц. В Oracle последовательность имеет два псевдостолбца:
CURRVAL - текущее значение последовательности;
NEXTVAL - увеличивает текущее значение на 1, а затем возвращает его.
В PostgreSQL для этой цели используются одноименные функции. Кроме этого есть функция setval, позволяющая задать текущее значение последовательности. Это можно использовать, например, при нумерации записей в выборке.
-- создаем последовательность
-- с параметрами по умолчанию
CREATE SEQUENCE seq;
-- создаем тестовую таблицу
create table tblseq(
id integer not null,
num double precision,
constraint pk_tblseq primary key (id)
);
-- вставляем данных для Oracle
insert into tblseq values(seq.nextval,3.14);
insert into tblseq values(seq.nextval,6.14);
insert into tblseq values(seq.nextval,7.14);
commit;
-- вставляем данные для PostgreSQL
insert into tblseq values(nextval('seq'),3.14);
insert into tblseq values(nextval('seq'),6.14);
insert into tblseq values(nextval('seq'),7.14);
commit;
-- проверяем
select * from tblseq;
-- уничтожение последовательности
DROP SEQUENCE seq;
Чтобы сделать присваивание значения первичного ключа автоматическим, в PostgreSQL надо подкорректировать значение столбца по умолчанию в определении таблицы, а для Oracle написать тригер.
-- для PostgreSQL
create table tblseq(
id integer not null DEFAULT nextval('seq'),
num double precision,
constraint pk_tblseq primary key (id)
);
-- для Oracle, создаем тригер tblseq_autoid
create or replace trigger tblseq_autoid
before insert on tblseq
for each row
declare
begin
select seq.nextval into :new.id from dual;
end tblseq_autoid;
-- теперь значение id будет устанавливаться
-- автоматически следующим значением
-- последовательности seq
insert into tblseq(num) values(3.14);
insert into tblseq(num) values(6.14);
insert into tblseq(num) values(7.14);
commit;
Столбцы с автоинкрементом
Как в MS Access введен специальный тип idenity или counter, так в MySQL и PostgreSQL можно использовать тип serial для автоматического создания последовательности связанной со столбцом таблицы. В MySQL также можно воспользоваться атрибутом столбца AUTO_INCREMENT в определении таблицы. Фактически, тип serial эквивалент определения BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE. В PostgreSQL для последовательности типа serial используется целое в 4 байта (serial4). Если это кажется малым, можно воспользоваться типом serial8.
-- для MySQL
CREATE TABLE tblname (
id integer unsigned AUTO_INCREMENT,
...
-- для MySQL и PostgreSQL
create table tblseq(
id serial,
num double precision,
constraint pk_tblseq primary key (id)
);
-- значение id будет устанавливаться автоматически
-- следующим значением
insert into tblseq(num) values(3.14);
insert into tblseq(num) values(6.14);
insert into tblseq(num) values(7.14);
commit;
При разработке клиентских программ необходимо знать значение первичного ключа последней вставленной записи для позиционирования на нее. В PostgreSQL для этого есть функция lastval(), возвращающая самое последнее сгенерированное значение для какой-либо последовательности (не важно созданной через SEQUENCE, или через тип serial) в текущей сессии. В MySQL аналогичная функция называетсяLAST_INSERT_ID().