CREATE TYPE
После создания нового типа PostgreSQL автоматически определяет тип массива для нового типа данных. Во внутреннем представлении этому типу присваивается имя_тип (с начальным символом подчеркивания). Все ссылки вида тип[] автоматически преобразуются к внутреннему типу массива (_тип).
Параметр DELIMITER позволяет задать символ-разделитель для массивов. Этот символ используется для разделения элементов массивов в константах, передаваемых PostgreSQL (например, {1, 2, 3}), а также при разделении элементов во внешнем отображении массивов этого типа. По умолчанию в качестве разделителя используется запятая.
Если вы предпочитаете смоделировать массив вручную, передайте функции PostgreSQL значения array_in и array_out в качестве входной и выходной функций соответственно, затем при помощи ключевого слова ELEMENT задайте типы данных элементов массива.
Ключевое слово DEFAULT задает значение по умолчанию, действующее при вставке в новое поле, на уровне системы. Обычно при отсутствии значения и ограничений DEFAULT поля инициализируются псевдозначением NULL. Учтите, что в PostgreSQL 7.1.x задается внутреннее представление значения по умолчанию.
Параметр выравнивание определяет принцип выравнивания нового типа данных в памяти. Для типов данных с переменным внутренним размером должно быть выбрано значение int4 или double.
Параметр храпение определяет метод хранения данных. Для типов данных с фиксированным внутренним размером может задаваться только тип plain, а для типов с переменной внутренней длиной допустимы значения plain, extended, external или main.
При выборе метода plain данные хранятся в несжатом, "буквальном" представлении, максимальный размер составляет 8 Кбайт. Метод extended позволяет превысить порог и работать со значениями большего размера, а также хранить данные вне физической таблицы с использованием расширения PostgreSQL TOAST (The Oversized Attribute Storage Technique), разработанного Томом Лейном (Tom Lane).
Метод external обладает определенным сходством с методом extended, но не пытается сжимать данные перед тем, как использовать расширение TOAST для хранения данных вне физических таблиц. Метод main тоже похож на extended – он также поддерживает сжатие и расширение TOAST, но ориентирован на физическое хранение данных в главной таблице и выбирает другой способ только в том случае, если не остается иного выбора.
Пример
В следующем примере создается новый числовой тип данных с именем zero, всегда представляющий нулевое значение. Сначала мы создаем входную и выходную функции, а затем определяем тип данных путем ссылок на эти функции.
booktown=# CREATE FUNCTION zero_out(opaque) RETURNS opaque booktown-# AS '/usr/local/pgsql/lib/zero.so' LANGUAGE 'C'; CREATE booktown=# CREATE FUNCTION zero_in(opaque) RETURNS zero booktown-# AS '/usr/local/pgsql/lib/zero.so' LANGUAGE 'C'; NOTICE: ProcedureCreate: type 'zero' is not yet defined CREATE booktown=# CREATE TYPE zero (internallength = 16, booktown(# input = zero_in, output = zero_out); CREATE