Почему unsigned integer недоступен в PostgreSQL?



я наткнулся на этот пост (в чем разница между tinyint, smallint, mediumint, bigint и int в MySQL?) и понял, что PostgreSQL не поддерживает unsigned integer.



кто-нибудь может помочь объяснить, почему это так?



большую часть времени я использую unsigned integer в качестве автоинкрементного первичного ключа в MySQL. В таком дизайне, как я могу преодолеть это, когда я портирую свою базу данных из MySQL в PostgreSQL?



спасибо.

730   3  

3 ответов:

уже ответили, почему postgresql не хватает беззнаковых типов. Однако я бы предложил использовать домены, для беззнаковых типов.

http://www.postgresql.org/docs/9.4/static/sql-createdomain.html

 CREATE DOMAIN name [ AS ] data_type
    [ COLLATE collation ]
    [ DEFAULT expression ]
    [ constraint [ ... ] ]
 where constraint is:
 [ CONSTRAINT constraint_name ]
 { NOT NULL | NULL | CHECK (expression) }

домен похож на тип, но с дополнительным ограничением.

для конкретного примера вы могли бы использовать

CREATE DOMAIN uint2 AS int4
   CHECK(VALUE >= 0 AND VALUE < 65536);

вот что дает psql, когда я пытаюсь злоупотреблять типом.

DS1=# select (346346 :: uint2);

ошибка: значение для домена uint2 нарушает контрольное ограничение "uint2_check"

Это не в стандарте SQL, поэтому общее стремление реализовать его ниже.

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

тем не менее, нет никаких причин, почему это не может быть сделано. Это просто много работы.

вы можете использовать проверочное ограничение, например:

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric CHECK (price > 0)
);

также PostgreSQL имеет serial и bigserial типы для автоматического приращения.

Comments

    Ничего не найдено.