- •Типы данных sql
- •Tочные числовые типы
- •Истинно целые типы
- •Точные типы, допускающие наличие дробной части
- •Приближенные числовые типы
- •Типы символьных строк
- •Типы битовых строк
- •Типы даты и времени
- •Тип даты
- •Типы времени
- •Типы временной метки
- •Типы времени и временной метки с временной зоной
- •Типы временных интервалов
- •Булевский тип
- •Типы коллекций
- •Типы массивов
- •Типы мультимножеств
- •Анонимные строчные типы
- •Типы, определяемые пользователем
- •Ссылочные типы
- •Типы данных PostgreSql 8.4.2
- •8.1. Числовые типы
- •8.1.1. Целочисленные типы
- •8.1.2. Числа с заданной точностью
- •8.1.3. Типы с плавающей точкой
- •8.1.4. Серийные типы
- •8.2. Денежные типы
- •8.3. Символьные типы
- •8.4. Двоичные типы данных
- •8.5. Типы дата/времени
- •8.5.6. Некоторые подробности по датам
- •8.6. Логический тип
- •8.7. Перечисления
- •8.8. Геометрические типы
- •8.9. Типы сетевых адресов
- •8.10. Типы битовых строк
- •8.11. Типы текстового поиска
- •8.11.1. Tsvector
- •8.11.2. Tsquery
- •8.12. Тип uuid
- •8.13. Тип xml
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