Почему unsigned integer недоступен в PostgreSQL?
я наткнулся на этот пост (в чем разница между tinyint, smallint, mediumint, bigint и int в MySQL?) и понял, что PostgreSQL не поддерживает unsigned integer.
кто-нибудь может помочь объяснить, почему это так?
большую часть времени я использую unsigned integer в качестве автоинкрементного первичного ключа в MySQL. В таком дизайне, как я могу преодолеть это, когда я портирую свою базу данных из MySQL в PostgreSQL?
спасибо.
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