2017-02-20 2 views

Répondre

1

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.

+0

Et bien que la valeur maxvalue soit de 64 bits, le type est toujours un nombre entier. –

+0

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

+0

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

0

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:

  1. créer un int4 ou d'une colonne int8
  2. créer une séquence
  3. faire la séquence appartenant à la colonne
  4. 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.