#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,
);