Fork me on GitHub

PostgreSQL - Типы данных

Типы данных

Серийные типы

Типы данных serial и bigserial не являются полноценными типами, а просто являются удобной нотацией для создания колонок уникальных идентификаторов (свойство сходное с AUTO_INCREMENT поддерживается и некоторыми другими СУБД). В текущей реализации, конструкция:

CREATE TABLE имя_таблицы (
  имя_колонки SERIAL
);

эквивалента конструкции:

CREATE SEQUENCE имя\_таблицы\_имя\_колонки\_seq;

CREATE TABLE имя\_таблицы (
  colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);

ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;

Таким образом, мы создали колонку с типом integer и назначили для неё значения по умолчанию, которые получаются с помощью генератора последовательности. Ограничение NOT NULL предназначено для того, чтобы иметь уверенность в том, что в колонку не могут быть вставлены значения null. (В большинстве случаев вам также понадобится применить ограничения UNIQUE или PRIMARY KEY, чтобы предотвратить появление в колонке дублированных значений. Эти ограничения не устанавливаются автоматически.) И наконец, последовательность отмечается как "принадлежащая" данной колонке, так что она будет удалена, если будет удалена эта колонка таблицы.

Note: До версии PostgreSQL 7.3, тип serial неявно включал ограничение UNIQUE. Но больше этого нет. Если вы хотите ограничение уникальности или первичного ключа для колонки с типом serial, вы теперь должны сделать его вручную, точно также как и для других типов данных.

Чтобы вставить следующее значение последовательности в колонку с типом serial, укажите, что в колонку с типом serial вставляется значение по умолчанию для этой колонки. Это можно сделать либо не указывая колонку с списке колонок в операторе INSERT, либо используя ключевое слово DEFAULT.

Массивы

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

CREATE TABLE sal_emp (
name            text,
pay_by_quarter  integer[],
schedule        text[][]
);

Ввод значения массива

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

Обращение к массивам

Добавив данные в таблицу, мы можем перейти к выборкам. Сначала мы покажем, как получить один элемент массива. Этот запрос получает имена сотрудников, зарплата которых изменилась во втором квартале:

SELECT name FROM sal_emp WHERE pay_by_quarter[1] <> pay_by_quarter[2];    

social