Время чтения: 3 min
Изменено:18.09.2026, 19:09:51
Создание типов данных в SQL
Типы данных — это определённый формат, структура и допустимые значения для поля.
Команды:
create type— создание типа данныхalter type— изменение типа данныхdrop type— удаление типа данных
Общий вид:
create type ИНДФ as ВИД(наполнение в зависимости от вида)
Виды:
enum— перечисление. Тип данных, в котором может приниматься одно из значений, указанных при создании типа. Общий тип:create type ИНДФ as enum('знач1','знач2')
Пример:
create type Pol as enum('М','Ж');
create table gr632_test12(
пол Pol not null
)
insert into gr632_test12 values ('М');
alter type Pol add value 'О'; -- Добавление значения
alter type Pol drop value 'О'; -- Удаление значения
drop type Pol cascade -- Если уже используется тип при удалении
domain— позволяет добавить ограничение (null,check,unique...) на тип данных.
Общий вид:
create domain ИНДФ as типдан ограничения
Пример:
create domain not_null_int as int not null;
create table gr632_test13(
a not_null_int,
b int
);
insert into gr632_test13(b) values (12);
Изменение существующего domain:
alter domain ИНДФ set|drop огр
Пример:
alter domain FFK set unique
-- alter domain FFK drop unique нельзя!
Удаление domain:
drop domain ИНДФ cascade
composite— позволяет объединить несколько полей в один тип данных, и к этим полям можно обращаться отдельно.
Общий вид:
create type ИНДФ as(ИДС типдан, ИДС типдан)
create type Адрес as (Улица varchar, Дом int, Квартира int);
create table gr632_test15(
id serial,
Адрес Адрес
);
insert into gr632_test15 values (1, ('Ленина', 12, 45));
Для уточнения, из какой части подстолбца взять данные, нужно заключить её в скобки.
select (Адрес).Дом from gr632_test15;
create type ФИО as (Фамилия text, Имя varchar, Отчество text);
Можно использовать в функциях:
create or replace function gr632()
returns Адрес as $$
begin
return (select t from (select 'asdsad'::varchar as Улица, 12 as Дом, 3 as Квартира) t);
end; $$
language plpgsql;
select gr632();
range— диапазонные типы данных, которые представляют интервалы значений (например, от 100 до 2000 или от 1999-10-10 до 2000-10-10). То есть создаём типы данных, к которым можно применить range в запросе.
В Postgres существуют стандартные range-типы данных:
int4range, int8range - для целочисленных
numrange- для дробных
tsrange, tstzrange, daterange - для даты и времени
Для создания своего типа
Общий вид:
create type ИНДФ as range(subtype = ... subtype_dif)
create type цена_range as range (subtype = numeric)
- Base type - это собственный тип данных, который создаётся при помощи других языков программирования(С/с++)
Общий вид:
create type ИНДФ(
Операторы и фукнции си
)
Пример:
create type complex(
input = complex_in,
output - complex_out,
internallength = 16
);
- Псевдотип — это типы данных, которые нельзя использовать при создании таблиц, но можно использовать в функциях:
record- принимает всё что угодноvoid- без возвращаемого значенияanyarray- любой массивanyelement- любой тип данныхcstring- указатель на строку