Как я могу установить ограничение по размеру для типа данных «int» в PostgreSQL 9.5

#sql #postgresql #rust #rust-diesel

#sql #postgresql #база данных-дизайн #sqldatatypes

Вопрос:

Я экспериментирую с PostgreSQL, исходящим из SQL, используя MySQL, и я просто хочу создать таблицу с этим фрагментом кода, который является допустимым SQL:

 CREATE TABLE flat_10
(
  pk_flat_id INT(30) DEFAULT 1,
  rooms      INT(10) UNSIGNED NOT NULL,
  room_label CHAR(1) NOT NULL,

  PRIMARY KEY (flat_id)
);
  

Я получаю сообщение об ошибке

 ERROR:    syntax error at or near "("
LINE 3:   pk_flat_id integer(30) DEFAULT 1,
  

Я провел поиск в Интернете и не нашел ответа, и, похоже, я не могу найти ответ в руководстве PostgreSQL. Что я делаю не так?

Я явно хочу установить ограничение на количество цифр, которые могут быть вставлены в поле «pk_flat_id»

Комментарии:

1. Ваш код допустим SQL только в MySQL 🙂

2. Возможно, вы захотите взглянуть на postgresql.org/docs/10/sql-createdomain.html если этот тип необходимо использовать повторно

Ответ №1:

Я явно хочу установить ограничение на количество цифр, которые могут быть вставлены в поле «pk_flat_id»

Ваше текущее определение таблицы ни в коем случае не налагает «ограничение на размер». В MySQL параметр для int типа данных является всего лишь подсказкой для приложений по ширине отображения столбца при его отображении.

Вы можете сохранить значение 2147483647 в int(1) без каких-либо проблем.

Если вы хотите ограничить значения, которые будут храниться в целочисленном столбце, вы можете использовать контрольное ограничение:

 CREATE TABLE flat_10
(
  pk_flat_id bigint DEFAULT 1,
  rooms      integer NOT NULL,
  room_label CHAR(1) NOT NULL,

  PRIMARY KEY (flat_id), 
  constraint valid_number 
      check (pk_flat_id <= 999999999)
);
  

Комментарии:

1. Почему вы указали размер (или что бы там ни обозначал символ (n)) для типа данных CHAR в столбце room_label?

2. @FlashspeedIfe: потому что вы сделали это и в своей исходной таблице. А для символьных типов данных размер действительно определяет ограничение.

Ответ №2:

Ответ заключается в том, что вы используете типы numeric или decimal . Они задокументированы здесь.

Обратите внимание, что эти типы могут принимать необязательный аргумент точности, но вам это не нужно. Итак:

 CREATE TABLE flat_10
(
  pk_flat_id DECIMAL(30) DEFAULT 1,
  rooms      DECIMAL(10) NOT NULL,
  room_label CHAR(1) NOT NULL,

  PRIMARY KEY (pk_flat_id)
);
  

Вот пример SQL.

Я не думаю, что Postgres поддерживает десятичные числа без знака. И, похоже, вам действительно нужны серийные типы для ваших ключей, а большое количество цифр излишне.

Ответ №3:

Изменение целого числа на числовое работает.

 CREATE TABLE flat_10
(
  pk_flat_id bigint DEFAULT 1,
  rooms      numeric NOT NULL,
  room_label CHAR(1) NOT NULL,
);