Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
db_lectures / 03. Типы данных PostgreSQL.docx
Скачиваний:
47
Добавлен:
21.05.2015
Размер:
60.86 Кб
Скачать

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

Типы данных 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.

Типы с именами serial и serial4 эквиваленты: оба создают колнки с типом integer. Точно также и типы с именами bigserial и serial8, за исключением того, что они создают колонки с типом bigint. Тип bigserial должен использоваться если вы ожидаете совместное использование более чем 231 индентификаторов в одной таблице.

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

8.2. Денежные типы

Тип money хранит значения валюты с фиксированной дробной частью; см. Table 8-3. Точность дробной части определяется настройкой СУБД lc_monetary. Ввод значений допускается в нескольких разных форматах, включая целые числа и числа с плавающей точкой, также как и значения в типичном для валюты формате, такие как '$1,000.00'. Вывод значений обычно осуществляется в последней форме, но зависит от локали. Числовые значения без кавычек могут быть сконвертированы в тип money с помощью приведения числового значения к типу text, а затем к типу money, например:

SELECT 1234::text::money;

Не существует простого способа выполнить обратное преобразование независимым от локали манером именованного приведённого значение типа money в какой-либо числовой тип. Если вы знаете какой символ валюты и разделитель тысяч используются, вы можете использовать regexp_replace():

SELECT regexp_replace('52093.89'::money::text, '[$,]', '', 'g')::numeric;

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

money 8 байт значения валюты -92233720368547758.08 to +92233720368547758.07