Je suis un peu confus et nouveau à PostgreSQL, je pensais que serial = integer et bigserial = bigint, donc je suis confus pourquoi je vois une séquence avec un max de 9223372036854775807 au lieu de 2147483647, quand je crée une table avec un PK c'est en série.Pourquoi la création d'une table avec une colonne en série crée-t-elle une séquence avec une valeur max d'un bigint?
Répondre
Comme indiqué dans the PostgreSQL 9.4 docs for Data Type SERIAL, une séquence est implicitement créée en utilisant CREATE SEQUENCE tablename_colname_seq
sans aucun paramètre supplémentaire.
Le documentation for CREATE SEQUENCE
dit:
La clause optionnelle MAXVALUEmaxvalue détermine la valeur maximale de la séquence. Si cette clause n'est pas fournie ou NO MAXVALUE est spécifié, les valeurs par défaut seront utilisées. Les valeurs par défaut sont 2^63-1 et -1 pour les séquences ascendantes et descendantes, respectivement.
Il est donc documenté que la séquence est créée avec la valeur maximale que vous êtes en train de visualiser.
La séquence et la colonne sont deux choses distinctes. Une séquence pourrait renvoyer un entier plus grand qu'une colonne int4 pourrait stocker. Lorsque vous spécifiez SERIAL
ou BIGSERIAL
, PostgreSQL se traduit à peu près que dans:
- créer un int4 ou d'une colonne int8
- créer une séquence
- faire la séquence appartenant à la colonne
- font la valeur par défaut de la colonne de la valeur suivante de la séquence
SERIAL
est une commodité, mais il n'y a pas de type de colonne réel SERIAL
.
Et bien que la valeur maxvalue soit de 64 bits, le type est toujours un nombre entier. –
Alors quel serait le moyen préféré pour créer une clé séquentielle sur une table et être en mesure de spécifier la valeur max. Je suppose qu'il suffit de créer un pk sur le type correspondant et créer la séquence vous-même et définir la valeur maximale. – OutOFTouch
Utilisez simplement les instructions SQL équivalentes à SERIAL et ajoutez 'MAXVALUE 2147483647' à la fin de l'instruction' CREATE SEQUENCE'. Si la séquence atteint jamais cette valeur maximale, vous aurez des ennuis de toute façon. Il suffit donc de laisser tel quel et cela provoquera éventuellement une erreur 'entier hors plage 'si tous les nombres entiers valides sont épuisés. –