class DarkRaha extends com { // разработка приложений
            String a="Главная" b="Контакты" c="О сайте"
};

основы sql

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

Dynamic SQL

прочее

Справочник по SQL

Обеспечение уникальности первичного ключа

В некоторых СУБД как Oracle и PostgreSQL для обеспечения уникальности первичного ключа можно воспользоваться объектом последовательность, генерирующий последовательность целых чисел. По умолчанию 1027 максимальное значение для восходящей последовательности в Oracle и 1063 в PostgreSQL. Так что одной последовательности вполне хватит на несколько таблиц. В Oracle последовательность имеет два псевдостолбца:

В 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().


Рейтинг@Mail.ru