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.
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"
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.
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.
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