web-dev-qa-db-fra.com

Pourquoi l'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 dans MySQL? ) et me suis rendu compte que PostgreSQL ne supporte pas les entiers non signés.

Quelqu'un peut-il aider à expliquer pourquoi il en est ainsi?

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 résoudre ce problème lorsque je transfère ma base de données de MySQL vers PostgreSQL?

Merci.

74
Adrian Hoe

On a déjà répondu à pourquoi postgresql manque de types non signés. Cependant, je suggérerais 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) }

Domain 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 donne psql lorsque j'essaie d'abuser du type.

DS1 = # select (346346 :: uint2);

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

31
Karl Tarbe

Ce n'est pas dans le standard SQL, donc l'envie générale 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 est donc difficile d’ajouter 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.

61
Peter Eisentraut

Vous pouvez utiliser une contrainte CHECK, par exemple:

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

De plus, PostgreSQL a les types serial et bigserial pour l’incrémentation automatique.

24
TriAnMan

Selon la documentation la plus récente, le nombre entier sélectionné est pris en charge, mais aucun nombre entier non signé dans la table. Cependant, le type de série est un peu similaire à unsigned sauf qu'il commence à 1 et non à zéro. Mais la limite supérieure est la même que celle chantée. Donc, le système n'a vraiment pas de support non signé. Comme Peter l'a souligné, la porte est ouverte pour implémenter la version non signée. Le code devra peut-être être mis à jour beaucoup, juste trop de travail en raison de mon expérience de la programmation en C.

https://www.postgresql.org/docs/10/datatype-numeric.html

integer     4 bytes     typical choice for integer  -2147483648 to +2147483647
serial  4 bytes     autoincrementing integer    1 to 2147483647
0
Kemin Zhou