Pourquoi un entier non signé n’est pas disponible dans PostgreSQL?

Je suis tombé sur ce post ( Quelle est la différence entre tinyint, smallint, mediumint, bigint et int en MySQL? ) Et que PostgreSQL ne supporte pas les entiers non signés.

Quelqu’un peut-il aider à expliquer pourquoi?

La plupart du temps, j’utilise un entier non signé comme clé primaire auto-incrémentée dans MySQL. Dans une telle conception, comment puis-je surmonter cela lorsque je transfère ma firebase database de MySQL vers PostgreSQL?

Merci.

Il est déjà répondu pourquoi postgresql manque de types non signés. Cependant, je suggère d’utiliser des domaines pour les types non signés.

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) } 

Le domaine est comme un type mais avec une contrainte supplémentaire.

Pour un exemple concret, vous pouvez utiliser

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

Voici ce que psql donne quand j'essaie d'abuser du type.

DS1 = # select (346346 :: uint2);

ERROR: la valeur du domaine uint2 viole la contrainte de vérification "uint2_check"

Ce n’est pas dans le standard SQL, donc le besoin général de l’implémenter est moindre.

Avoir trop de types entiers différents rend le système de résolution de type plus fragile, il y a donc une certaine résistance à append plus de types dans le mélange.

Cela dit, il n’y a aucune raison pour que cela ne soit pas possible. C’est juste beaucoup de travail.

Vous pouvez utiliser une contrainte CHECK, par exemple:

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

Aussi, PostgreSQL a des types serial et bigserial pour l’incrémentation automatique.